object.__getattr__(self, name)
该方法在使用通常属性查找未找到时调用(即它不是实例属性,也不在类树中找到 )。
name是属性名称。此方法应返回(计算)属性值或引发AttributeError异常。
object.__getattribute__(self, name)
该方法会在实例的属性访问时调用。
如果类也定义了__getattr__() ,则__getattr__() 会在__getattribute__() 明确地调用它或者引发AttributeError时才会被调用。
__getattribute__()方法应返回(计算)属性值或引发AttributeError异常。
为了避免这种方法的无限递归,它的实现应该始终使用相同的名称调用基类方法来访问它需要的任何属性,例如。
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)
该方法在尝试进行属性分配时调用。会代替正常的存储机制(即将实例字典中的值存储)。 name是属性名称,value是要分配给它的值。 如果__setattr __()要分配给一个实例属性,它应该调用具有相同名称的基类方法,例如object.__setattr__(self, name, value)。
object.__ delattr__(self, name)
用法类似__setattr__(),用于属性删除操作。在对象的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) 在对象上调用dir()时调用。必须返回一个序列。 dir()将返回的序列转换为列表并进行排序。
详细请参考:
3. Data model — Python 3.6.2 documentation Customizing attribute access
网友评论