封装 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__
当对象没有要求的属性时被调用。
我有一个 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__
当对象没有要求的属性时被调用。