????查找一個(gè)實(shí)例或類(lèi)的屬性失敗時(shí)皂股,會(huì)調(diào)用__getattr__方法查找相應(yīng)的屬性,如果類(lèi)里面沒(méi)有定義該方法的話据德,則會(huì)報(bào)AttributeError的錯(cuò)誤般此。下面簡(jiǎn)單的寫(xiě)個(gè)示例來(lái)說(shuō)明__getattr__在類(lèi)組合時(shí)的應(yīng)用。
#!/usr/bin/env python
class proxy(object):
? ? def test(self):
? ? ? ? print "foo in proxy"
? ? def resize(self, size):
? ? ? ? print "bar in proxy", size
class rbd(object):
? ? def __init__(self):
? ? ? ? self.proxy = proxy()
? ? def test(self):
? ? ? ? print "test in rbd"
? ? ? ? self.proxy.test()
? ? def __getattr__(self, attrib):
? ? ? ? return getattr(self.proxy, attrib)
if __name__=='__main__':
? ? a = rbd()
? ? a.test()
? ? a.resize(10)
可以看到撬槽,如果rbd想要改變proxy類(lèi)里的某個(gè)方法此改,只需要定義一個(gè)同名的方法就可以了趾撵。如果想要繼承proxy類(lèi)里的方法侄柔,直接調(diào)用實(shí)現(xiàn)__getattr__方法就行了。這種組合比直接繼承更加靈活占调。