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)