2013-08-21 108 views
0

我有以下代碼,它來自O'Reilly Media出版的Learning Python。爲什麼第3行(self._name = name)不會觸發__getattribute__?是否因爲__setattr__覆蓋它?__setattr__可以覆蓋Python中的__getattribute__嗎?

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 
+0

您不需要獲取要設置它的屬性。 – user2357112

回答

4

設置的屬性。賦值給一個屬性總是使用__setattr__

__getattr____getattribute__查找一個特定屬性的值時只協商;當設置你沒有檢索到一個值。

這不是一個覆蓋;即使__setattr__未定義,__getattribute__方法將而不是被諮詢。

相關問題