今天我们来深入了解python中类属性的委托访问,这个相当于设计模式中的代理模式,代理模式就是使用这个委托访问生成的。不废话,先来一段简单的代码,来看一下最简单的委托形式:
class A:
def f_one(self, x):
pass
def f_two(self):
pass
class B(A):
def __init__(self):
self._a = A()
def f_one(self, x):
return self._a.f_one(x)
def f_two(self):
return self._a.f_two()
def f_three(self):
pass
这就是一个最简单的委托,将A的实例在B类中生成,并且转化为B的一个私有属性,当我们需要访问A的属性的时候,加入我们只暴露B出来,这时候就只能通过B类来访问A类,这就达到了委托的效果。
上面的这种方法使用情景为:有几个方法需要委托,当我们需要大量委托的时候这显然不是一个好办法,这时候还有另一个更巧妙的方法:getattr()方法,下面请看代码:
class A:
def f_one(self, x):
pass
def f_two(self):
pass
class B(A):
def __init__(self):
self._a = A()
def f_three(self):
pass
def __getattr__(self, name):
return getattr(self._a, name)
这里要注意一下这个新的方法,这个方法的作用是用来查找所有的属性,放在这里时,如果代码中尝试访问这个类中不存在的属性时,会去调用实例_a中的属性,这样就可以实现大量的代理。这里面还是比较绕,每次简单一点,慢慢体会。