封装 class calls/modifies 原始目录中的东西 class

encapsulating class calls/modifies things in the dir of original class

我有一个 class A 封装了一个 class B 实例和其他东西。以下是玩具示例。

class B(object):
    def __init__(self):
        self.b = 2
    def square(self):
        return self.b * self.b

class A(object):
    def __init__(self, x):
        self.b = B()

a = A(1)
print(a.b.square())   

任何时候一个A实例想要调用B中的一个方法,我总是需要做类似'a.b'的事情。为了方便用户,我希望摆脱“.b”。以下代码可以完成这项工作。

class B(object):
    def __init__(self):
        self.b = 2
    def square(self):
        return self.b * self.b

class A(object):
    def __init__(self, x):
        self.b = B()
    def square(self):
        return self.b.square()

a = A(1)
print(a.square())

问题是 class B 来自库外,目录 中有很多不同类型的东西。我无法像上面那样手动进行一项一项的操作。有什么神奇的方法来处理吗?

Any magical ways to handle that?

是python,当然有!您可以使用 __getattr__ 函数来代理对 b:

的未知调用
class B(object):
    def shadowed(self):
        print('B.shadowed')

    def unshadowed(self):
        print('B.unshadowed')


class A(object):
    def __init__(self):
        self._b = B()

    def shadowed(self):
        print('A.shadowed')

    def __getattr__(self, name):
        return getattr(self._b, name)


test = A()
test.shadowed()
test.unshadowed()
test.unknown()

结果:

A.shadowed
B.unshadowed
Traceback (most recent call last):
  File "/Users/Andrew/Desktop/test.py", line 23, in <module>
    test.unknown()
  File "/Users/Andrew/Desktop/test.py", line 17, in __getattr__
    return getattr(self._b, name)
AttributeError: 'B' object has no attribute 'unknown'

__getattr__ 当对象没有要求的属性时被调用。