我有以下代码,它来自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
答案 0 :(得分:4)
您设置属性。对属性的分配始终使用__setattr__
。
__getattr__
和__getattribute__
;在设置时,您没有检索值。
这不是覆盖;即使未定义__setattr__
,__getattribute__
方法也不会