object.__getattr__(self, name)
該方法在使用通常屬性查找未找到時(shí)調(diào)用(即它不是實(shí)例屬性盯串,也不在類樹中找到 )。
name是屬性名稱鸡岗。此方法應(yīng)返回(計(jì)算)屬性值或引發(fā)AttributeError異常鸳劳。
object.__getattribute__(self, name)
該方法會(huì)在實(shí)例的屬性訪問時(shí)調(diào)用。
如果類也定義了__getattr__() 宝鼓,則__getattr__() 會(huì)在__getattribute__() 明確地調(diào)用它或者引發(fā)AttributeError時(shí)才會(huì)被調(diào)用刑棵。
__getattribute__()方法應(yīng)返回(計(jì)算)屬性值或引發(fā)AttributeError異常。
為了避免這種方法的無限遞歸愚铡,它的實(shí)現(xiàn)應(yīng)該始終使用相同的名稱調(diào)用基類方法來訪問它需要的任何屬性蛉签,例如胡陪。
class dict_alt(object):
base = {}
def __getattribute__(self, name):
if name == 'test':
return "hello"
elif name[:4] == 'test':
print("no more test")
raise AttributeError("'dict_alt' object has no attribute %s" % name)
elif name == 'dict':
return object.__getattribute__(self, 'base')
else:
return self.dict.__getattribute__(name)
def __getattr__(self, name):
return "Hi, This is Joke"
if __name__ == '__mian__':
d = dict_alt()
print(d.test)
# hello
print(d.test_another)
# no more test
# Hi, This is Joke
d.dict[2]=3
print(d.dict)
# {2:3}
print(d.get(2))
# 3
object.__setattr__(self, name, value)
該方法在嘗試進(jìn)行屬性分配時(shí)調(diào)用。會(huì)代替正常的存儲(chǔ)機(jī)制(即將實(shí)例字典中的值存儲(chǔ))碍舍。 name是屬性名稱柠座,value是要分配給它的值。 如果__setattr __()要分配給一個(gè)實(shí)例屬性片橡,它應(yīng)該調(diào)用具有相同名稱的基類方法妈经,例如object.__setattr__(self, name, value)。
object.__ delattr__(self, name)
用法類似__setattr__()捧书,用于屬性刪除操作吹泡。在對(duì)象的del obj.name有意義的情況下使用。
class dict_alt(object):
base = {}
def __setattr__(self, name, value):
if name in object.__dir__(self, name):
object.__setattr__(self, name, value):
else:
self.base[name] = value
def __getattr__(self, name):
if name in self.base:
return self.base[name]
else:
raise AttributeError("'dict_alt' object has no attribute %s" % name)
def __delattr__(self, name):
if name in object.__dir__(self, name):
del object.name
elif name in self.base:
del self.base[name]
else:
raise AttributeError("'dict_alt' object has no attribute %s" % name)
if __name__ == '__main__':
d = dict_alt()
d.C = 4
d.a = 12
print(d.base)
# {'C': 4, 'a': 12}
print(d.C)
# 4
print(d.a)
# 2
object.__dir__(self) 在對(duì)象上調(diào)用dir()時(shí)調(diào)用鳄厌。必須返回一個(gè)序列荞胡。 dir()將返回的序列轉(zhuǎn)換為列表并進(jìn)行排序。
詳細(xì)請(qǐng)參考:
3. Data model — Python 3.6.2 documentation Customizing attribute access