2

クラス内でメソッドと属性が同じ名前の場合はどうなるのでしょうか。プログラムは最初にオブジェクトの属性を検索し、クラスのメソッドが同じ名前の場合、プログラムはそれをスキップしてオブジェクトに焦点を合わせますか?

4

2 に答える 2

1

どちらが最初に割り当てられるかによって異なります。

メソッドが最初に割り当てられている場合、属性はアクセスする属性になります。

例えば

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

メソッドが属性を上書きすることを示します。

于 2013-02-07T09:24:11.070 に答える
1

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__が定義されている場合、ルックアップはさらに複雑になる可能性があります。

于 2013-02-07T10:37:28.410 に答える