Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,它们是面向对象的 Python 的一切。它们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了某一个魔法方法,那么这个方法就会在特殊的情况下自动被 Python 所调用。
功能
该方法定义了用户试图访问一个不存在的属性时的行为。
参数
self 指对象本身,item 是一个字符串,代表欲访问属性的名字。
返回值
默认为 None,返回值会自动返回给触发它的对象。
示例
class MyTest:
def __getattr__(self, item):
return 18
sample = MyTest()
print(sample.age)
# 使用 '.' 操作符访问对象时触发此方法
print(sample.__dict__)
当 __getattribute__ 和 __getattr__ 同时存在时,会先执行 __getattribute__ 方法,若该方法能正常返回一个值,那么 __getattr__ 方法就不会被执行。若该方法没有正常返回一个值(产生了异常(AttributeError)或属性不存在),则 __getattr__ 方法就会在 __getattribute__ 之后被执行。__getattr__()
函数是特殊函数。它仅当属性不能在实例的 __dict__ 或它的类,或者祖先类中找到时,才被调用。程序员主要用 __getattr__() 来实现类的灵活性,或者用它来做一些兜底的操作。绝大多数情况下,需要的是 __getattr__()。
示例:
class Count(object):
def __init__(self, min, max):
self.min = min
self.max = max
self.current = None
def __getattribute__(self, item):
print(type(item), item)
if item.startswith('cur'):
raise AttributeError
return object.__getattribute__(self, item)
obj1 = Count(1, 10)
print(obj1.min)
print(obj1.max)
print(obj1.current)