2

我遇到了有意__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。我发现这是基于实现委托的原则,并且更喜欢将子类化或类型检查作为将调用委托给适当对象的直接方式。有些人认为这没问题,而且是必需的。有没有人发现这有什么明显的缺点,或者采用这种授权策略好不好?

4

1 回答 1

3

这种代码本质上难以遵循并且容易出错。在某些情况下,覆盖__getattr__是完成工作的最直接方法,在这些情况下,就去做吧。但总是在可能的情况下更喜欢子类化或组合,因为__getattr__重写可能会很痛苦。

于 2013-10-11T17:26:21.257 回答