Pythonの高度な構文
インスタンスメソッド、静的メソッド、クラスメソッド
クラス属性、インスタンス属性
それらは定義と使用法が異なり、最も本質的な違いはメモリに格納されている場所が異なることです。
- インスタンス属性はオブジェクトに属します
- クラス属性はクラスに属します
コード例:
class Province(object):
# 类属性
country = '中国'
def __init__(self, name):
# 实例属性
self.name = name
# 创建一个实例对象
obj = Province('山东省')
# 直接访问实例属性
print(obj.name)
# 直接访问类属性
Province.country
上記のコードから、[インスタンス属性はオブジェクトを介してアクセスする必要がある] [クラス属性はクラスを介してアクセスする]ことがわかります。使用中は、インスタンス属性とクラス属性の属性が異なることがわかります。
コンテンツの保存方法は次の図のようになります。
上の図からわかります。
クラス属性のコピーは1つだけメモリに保存され、
インスタンス属性のコピーは各オブジェクトに1つ保存されます。
アプリケーションシナリオ:
クラスを介してインスタンスオブジェクトを作成するときに、各オブジェクトに同じ名前の属性が必要な場合は、クラス属性を使用して1つのコピーを使用します。
インスタンスメソッド、静的メソッド、クラスメソッド
メソッドには、インスタンスメソッド、静的メソッド、クラスメソッド、3つのメソッドはメモリ内のクラスに属していますが、違いは呼び出しメソッドの違いにあります。
- インスタンスメソッド:オブジェクトによって呼び出されます。少なくとも1つの自己パラメータ。インスタンスメソッドが実行されると、メソッドを呼び出すオブジェクトは自動的に自己に割り当てられます。
- クラスメソッド:クラスによって呼び出されます。少なくとも1つのclsパラメータ。クラスメソッドが実行されると、メソッドを呼び出すクラスが自動的にclsに割り当てられます。
- 静的メソッド:クラスによって呼び出されます。デフォルトのパラメーターはありません。
コード例:
class Foo(object):
def __init__(self, name):
self.name = name
def ord_func(self):
""" 定义实例方法,至少有一个self参数 """
# print(self.name)
print('实例方法')
@classmethod
def class_func(cls):
""" 定义类方法,至少有一个cls参数 """
print('类方法')
@staticmethod
def static_func():
""" 定义静态方法 ,无默认参数"""
print('静态方法')
f = Foo("中国")
# 调用实例方法
f.ord_func()
# 调用类方法
Foo.class_func()
# 调用静态方法
Foo.static_func()
比較:
- 類似性:すべてのメソッドで、それらはクラスに属しているため、1つのコピーのみがメモリに保存されます
- 違い:メソッドの呼び出し元が異なり、メソッドが呼び出されたときに自動的に渡されるパラメーターが異なります。