Python - オブジェクト指向の属性、クラスメソッド、静的メソッド、インスタンスメソッドの違いと詳しい使い方

I.はじめに

  • Python のオブジェクト指向プログラミングでは、クラス属性とインスタンス属性は 2 つの異なる概念であり、範囲と使用法が異なります。
  • Pythonのオブジェクト指向プログラミングにはインスタンスメソッド、クラスメソッド、静的メソッドの3つのメソッドがあり、その違いは主にパラメータの渡し方と呼び出し方にあります。

2. オブジェクト指向 - クラス属性とインスタンス属性

1. 違い

Python では、クラス属性とインスタンス属性の違いはスコープです。

  • クラス属性は、クラス オブジェクトに属する属性です。その値は、クラスのすべてのインスタンスで同じです。クラス属性には、クラス名またはインスタンス名を通じてアクセスできます
  • インスタンス属性はインスタンス オブジェクトに属する属性であり、各インスタンスは独自の属性値を持つことができます。インスタンスのプロパティには、インスタンス名を介してのみアクセスできます

2. サンプルコード

class MyClass:
    class_attr = "I am a class attribute"

    def __init__(self, ins_attr):
        self.ins_attr = ins_attr


if __name__ == '__main__':
    obj1 = MyClass("I am an instance attribute of obj1")
    obj2 = MyClass("I am an instance attribute of obj2")

    print(obj1.class_attr)  # 输出 "I am a class attribute"
    print(obj2.class_attr)  # 输出 "I am a class attribute"

    print(obj1.ins_attr)  # 输出 "I am an instance attribute of obj1"
    print(obj2.ins_attr)  # 输出 "I am an instance attribute of obj2"

    obj1.class_attr = "I am a new update class attribute of obj1"
    print(obj1.class_attr)  # 输出 "I am a new update class attribute of obj1"
    print(obj2.class_attr)  # 输出 "I am a class attribute"

    MyClass.class_attr = "I am a new MyClass attribute"
    print(obj1.class_attr)  # 输出 "I am a new update class attribute of obj1"
    print(obj2.class_attr)  # 输出 "I am a new MyClass attribute"
    print(MyClass.class_attr)  # 输出 "I am a new MyClass attribute"

上記のコードでは、クラス属性 class_attr とインスタンス属性 name を持つ MyClass クラスを定義します。obj1 と obj2 をインスタンス化した後、それぞれのインスタンス属性とクラス属性にアクセスし、次にクラス属性の値を変更し、2 つのインスタンスのクラス属性値にそれぞれアクセスして、最後に属性値を出力しました。各インスタンスの 。

実行結果は以下の通りです

ここに画像の説明を挿入します
上記の実行結果からわかるように、

  • 实例对象用途に応じて変更する类属性、インスタンスオブジェクトのクラス属性が変更されますが、それは自身(変更されたインスタンスオブジェクト)にのみ影響し、他のインスタンスの属性値には影響しません。
  • 直接変更する类属性、クラス属性が変更され、他のインスタンスオブジェクトにも反映されます。他のインスタンスオブジェクトのアクセス結果は、そのクラスのクラス属性を変更した結果になりますが、インスタンスのクラス属性を変更した結果になります。 Impact、その class 属性の値は、その (インスタンス オブジェクトの) 変更された値です。

3. まとめ

  • クラス属性はクラスのグローバル変数です。すべてのインスタンス オブジェクトは値を共有し、クラス名またはインスタンス オブジェクトを通じてアクセスできます。さらに、さまざまな変更方法がクラス属性の最終出力に影響を与える可能性があることに注意してください。
  • インスタンス プロパティはインスタンス オブジェクトのプライベート プロパティであり、各インスタンス オブジェクトには独自の値があり、インスタンス オブジェクトを介してのみアクセスできます。

実際の開発では、実際の状況に応じてクラス属性とインスタンス属性の使用を選択する必要があります

2. よく使われるクラス属性、メソッドの装飾方法と使い方

1.@プロパティ

メソッドを属性に変換し、属性と同様にアクセスできるようにします。

class MyClass:
    def __init__(self, value):
        self._x = value
    
    @property
    def x(self):
        return self._x
    
c = MyClass(5)
print(c.x)  # 输出5

2.@クラスメソッド

メソッドをクラスメソッドとして宣言し、クラス名で呼び出します。

class MyClass:
    x = 0
    
    @classmethod
    def classmethod(cls):
        cls.x += 1
        return cls.x
    
print(MyClass.classmethod())  # 输出1
print(MyClass.classmethod())  # 输出2

3.@静的メソッド

メソッドを静的メソッドとして宣言すると、オブジェクトをインスタンス化せずに呼び出すことができます。

class MyClass:
    @staticmethod
    def staticmethod():
        return "This is a static method."
    
print(MyClass.staticmethod())  # 输出"This is a static method."

4. @get.setter

プロパティ値の設定に使用するメソッドは、@property メソッドで定義する必要があります。

class MyClass:
    def __init__(self, value):
        self._x = value
    
    @property
    def x(self):
        return self._x
    
    @x.setter
    def x(self, value):
        self._x = value * 2
    
c = MyClass(5)
print(c.x)  # 输出5
c.x = 10
print(c.x)  # 输出20

5. @get.deleter

属性の削除に使用するメソッドは、@property メソッドの下に定義する必要があります。

class MyClass:
    def __init__(self, value):
        self._x = value
    
    @property
    def x(self):
        return self._x
    
    @x.deleter
    def x(self):
        del self._x
    
c = MyClass(5)
print(c.x)  # 输出5
del c.x
# print(c.x)  # AttributeError: 'MyClass' object has no attribute '_x'

6. @cached_property

キャッシュ属性は 1 回だけ計算され、その後のアクセスではキャッシュされた値が直接返されます。

from cached_property import cached_property

class MyClass:
    @cached_property
    def x(self):
        print("Calculating x.")
        return 5
    
c = MyClass()
print(c.x)  # 输出Calculating x. 5
print(c.x)  # 输出5

7.@lazy_attribute

計算はプロパティへの最初のアクセス時に実行され、それ以降はキャッシュされた値が返されます。

from lazy_object_proxy import Proxy

class MyClass:
    def __init__(self):
        self._my_property = Proxy(self.calculate_my_property)

    def calculate_my_property(self):
        print("Calculating my_property!")
        return 100

    @property
    def my_property(self):
        return self._my_property

my_class = MyClass()
print(my_class.my_property) # Output: Calculating my_property! 100
print(my_class.my_property) # Output: 100

2. オブジェクト指向 - クラスメソッド、静的メソッド、インスタンスメソッド

1. 3 つの主な違い:

1. クラスメソッド:

@classmethod装飾にはデコレータを使用します。最初のパラメータのデフォルトは でcls、クラス自体を表します。クラス メソッドは、クラスおよびクラスのインスタンス オブジェクトによって呼び出すことができます。インスタンス属性およびインスタンス メソッドには、クラス メソッドではアクセスできません。これは、インスタンス オブジェクトには依存せず、クラス オブジェクトの作成やクラス属性の操作に通常使用されるクラス自体に依存するためです。

2. インスタンスメソッド:

インスタンス メソッドには特別なデコレータはなく、最初のパラメータはデフォルトでselfインスタンス自体を表す に設定されます。インスタンス メソッドはインスタンス オブジェクトに依存するため、インスタンス オブジェクトによってのみ呼び出すことができます。インスタンス メソッドは、インスタンス オブジェクトのプロパティおよび他のインスタンス メソッドにアクセスできます。

3. 静的メソッド:

@staticmethod装飾にはデコレータを使用します。独自のオブジェクトselfclsパラメータを表す必要はありません。静的メソッドはクラスのツール キットです。クラスやインスタンス オブジェクトとは何の関係もありません。通常、ツール関数やクラスの初期化操作に使用されます。

2. クラス メソッドとインスタンス メソッドの違いについても紹介します。

  • クラス メソッドは@classmethodデコレータで装飾されますが、インスタンス メソッドは装飾されません。
  • クラス メソッドの最初のパラメータはクラス オブジェクト ( cls) ですが、インスタンス メソッドの最初のパラメータはインスタンス オブジェクト ( self) です。
  • クラス メソッドはクラス名を通じて直接呼び出すことができますが、インスタンス メソッドはインスタンス オブジェクトを通じて呼び出す必要があります。
  • クラス メソッドはすべてのインスタンスで同じですが、インスタンス メソッドはインスタンスごとに異なる場合があります。
  • クラス メソッドは通常、クラス属性およびクラス状態操作の作成、変更、クエリに使用され、インスタンス メソッドは通常、インスタンス属性およびインスタンス状態操作の操作に使用されます。
  • クラス メソッドはクラス属性にアクセスできますが、インスタンス属性にはアクセスできません。インスタンス メソッドは、インスタンス属性とクラス属性にアクセスできます。

クラス メソッドとインスタンス メソッドを使用する場合は、特定のビジネス ニーズに応じてどちらのメソッドを使用するかを選択する必要があります。

3. サンプルコードの説明と説明

1. インスタンスメソッド:

Python では、クラス内のすべての関数はデフォルトでインスタンス メソッドです。インスタンス メソッドは、self最初のパラメータとして使用されるメソッドです。オブジェクトをインスタンス化することで呼び出すことができます。インスタンス内のデータにアクセスし、インスタンスを変更できます。 . data は、最も一般的に使用されるメソッドの 1 つです。

class MyClass:
    def my_instance_method(self, arg1, arg2):
        # 实例方法的代码
        pass

instance = MyClass()
instance.my_instance_method(arg1, arg2)

2. クラスメソッド:

クラス メソッドは、最初のパラメータとして cls を取るメソッドです。クラス名またはオブジェクト名で呼び出すことができ、クラス変数を変更することもできますが、インスタンス変数にはアクセスできません。クラス メソッド@classmethodはデコレータを使用して定義されます。

サンプルコード

class MyClass:
    class_var = 0

    @classmethod
    def my_class_method(cls, arg1, arg2):
        # 类方法的代码
        cls.class_var += 1
        pass

MyClass.my_class_method(arg1, arg2)

3. 静的メソッド:

このようなメソッドもクラス メンバー メソッドですが、クラスまたはインスタンス コンテキストにアクセスする必要はありません。静的メソッドは、デフォルトのパラメーターを使用せずに、通常の関数と同様に呼び出すことができます。
静的メソッドはパラメータを渡す必要がありません。クラスやインスタンスとは何の関係もありません。クラス名またはオブジェクト名を使用して呼び出すことができます。したがって、静的メソッドはインスタンス変数やクラス変数にアクセスできません。静的メソッドは次のように定義されます。デコレータ@staticmethod

class MyClass:
    @staticmethod
    def my_static_method(arg1, arg2):
        # 静态方法的代码
        pass

MyClass.my_static_method(arg1, arg2)

3. 概要:

  • インスタンス メソッドは最も一般的に使用されるメソッド タイプであり、インスタンスによってのみ呼び出すことができます。最初のパラメータはself;です。
  • クラス メソッドと静的メソッドは、クラスまたはインスタンスを通じて呼び出すことができるクラス メンバー メソッドです。
  • クラス メソッドの最初のパラメータは でcls、現在のクラス オブジェクトを示します。
  • 静的メソッドにはデフォルトのパラメーターがなく、クラスのコンテキストは渡されません。

以上、Python におけるオブジェクト指向の属性、クラスメソッド、静的メソッド、インスタンスメソッドの違いと使い方についてでしたので、お役に立てれば幸いです。

おすすめ

転載: blog.csdn.net/qq_43030934/article/details/132459157