クラス内でメソッドと属性が同じ名前の場合はどうなるのでしょうか。プログラムは最初にオブジェクトの属性を検索し、クラスのメソッドが同じ名前の場合、プログラムはそれをスキップしてオブジェクトに焦点を合わせますか?
2 に答える
どちらが最初に割り当てられるかによって異なります。
メソッドが最初に割り当てられている場合、属性はアクセスする属性になります。
例えば
class Example(object):
def __init__(self):
self.x = 44
def x(self):
return "hi"
print Example().x
メソッドは、クラスが処理されるときに「割り当て」られます。x は初期化時に割り当てられます。これは、x がメソッドを上書きすることを意味します。
クラス レベルの属性はメソッドと同時に割り当てられるため、これはもちろん異なります。
class Example(object):
x = 43
def x(self):
return "hi"
print Example().x
メソッドが属性を上書きすることを示します。
Jakob の答えはほとんど正確ですが、不完全です。クラスでx
定義された が記述子プロトコルに従い、__get__
および__set__
メソッドが定義されている場合、インスタンス ディクショナリの「x」よりも引き続き優先されます。これを確認する最も簡単な方法は、次を使用することproperty
です。
>>> class Example(object):
def __init__(self):
self.x = 44
@property
def x(self):
return "hi"
@x.setter
def x(self, value):
self.__dict__['x'] = value
>>> Example().x
'hi'
>>> Example().__dict__['x']
44
したがって、実際のルールは、Python がクラス (およびそのベース) を検索し、一致するオブジェクトが見つかり、そのオブジェクトに__get__
メソッドがある場合 (または__set__
設定されている場合)、そのメソッドを呼び出します。__get__
それ以外の場合は、インスタンス属性を探してそれを使用します。存在する場合、または存在しない場合は、class 属性 (つまり、メソッド) の使用にフォールバックします。
__getattribute__
または__getattr__
が定義されている場合、ルックアップはさらに複雑になる可能性があります。