我遇到了代码,它故意使用__getattr__
进行委派。
class ClassA(object):
def __init__(self):
self.a = 10
self.b = 20
def methodA(self):
return "method A"
class ClassB(object):
def __init__(self):
self.a = 30
self.b = 40
def methodB(self):
return "method B"
def __getattr__(self, arg):
return getattr(ClassA(), arg)
obj = ClassB()
obj.methodB()
obj.methodA()
try:
obj.something
except AttributeError:
print("Attribute not found.")
这是有效的,因为__getattr__
是最后查找的,当它在ClassA中找不到时,它被委派到classB。我发现这是基于实现委托的原则,并且更喜欢子类化或类型检查作为将调用委托给适当对象的直接方式。
有些人发现这是好的,是必需的。有没有人发现任何明显的缺点,或者采用这种授权策略是否合适?
答案 0 :(得分:3)
这种代码本质上难以理解并且容易出错。在某些情况下,覆盖__getattr__
是最简单的完成任务的方式,在这种情况下,请去做。但是在可能的情况下总是更喜欢子类或组合,因为__getattr__
覆盖可能很难做到正确。