52. Python __getattr__

Par @Martin dans le
Tags :

    Python 高级特性之定制类中已经提到过 __getattr__ 及其的一种应用 (Restful API), 除此之外, __getattr__ 还可以用来实现组合模式 (需要配合反射) – 组合优于继承.

    class Element(object):
      def foo(self):
        print 'foo in Element'
    
      def bar(self):
        print 'bar in Element'
    
    class Composite(object):
      def __init__(self):
        self.element = Element()
    
      def foo(self):
        print 'foo in Composite'
        self.element.foo()
    
      def __getattr__(self, name):
        return getattr(self.element, name)
    
    if __name__ == '__main__':
      a = Composite()
      a.foo()
      a.bar()
    


    如果 Composite 需要修改 Element 的行为, 那么定义一个同名的属性就行了, 其他的想直接”继承”的属性,通通交给 __getattr__ 就行了.