查找一个实例或类的属性失败时,会调用__getattr__方法查找相应的属性,如果类里面没有定义该方法的话,则会报AttributeError的错误。下面简单的写个示例来说明__getattr__在类组合时的应用。
#!/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类里的某个方法,只需要定义一个同名的方法就可以了。如果想要继承proxy类里的方法,直接调用实现__getattr__方法就行了。这种组合比直接继承更加灵活。