0

次のコードがあります。これは、O'Reilly Media から発行された Learning Python からのものです。3 行目 ( self._name = name) がトリガーされないのはなぜ__getattribute__ですか? それを__setattr__上書きするからですか?

class Person:                               # Portable: 2.X or 3.X
    def __init__(self, name):               # On [Person()]
        self._name = name                   # Triggers __setattr__!

    def __getattribute__(self, attr):                 # On [obj.any]
                print('get: ' + attr)
                if attr == 'name':                         # Intercept all names
                    attr = '_name'                         # Map to internal name
                return object.__getattribute__(self, attr) # Avoid looping here

    def __setattr__(self, attr, value):     # On [obj.any = value]
        print('set: ' + attr)
        if attr == 'name':
            attr = '_name'                  # Set internal name
        self.__dict__[attr] = value         # Avoid looping here
4

1 に答える 1

4

属性を設定しています。属性への代入は常に を使用します__setattr__

__getattr__特定の属性の値を検索するときに__getattribute__のみ参照されます。設定するときは、値を取得していません。

これはオーバーライドではありません。__setattr__が定義されていない場合でも、__getattribute__メソッドは参照されません

于 2013-08-21T20:50:24.947 に答える