我有以下类继承架构:
object <- A <- B <- Z
现在每个类都有公共setup()
方法,它调用其他“私有”方法_configure()
,其中包含我不想弄乱的加载代码setup()
。关键是让每个班级“知道”如何设置自己,并在其他执行之前完成。
因此,在 Z 的实例上调用 setup 时我想要的是同时运行A的设置和 B 的设置(顺序现在不是特别重要),而每个设置都使用在其自己的类中定义的 _configure。
现在跟随脚本
#!/usr/bin/python
class A(object):
def __init__(self):
self.configured = []
self.set_up = []
def _configure(self):
self.configured.append("A")
def setup(self):
self._configure() # calls B._configure()!
self.set_up.append("A")
class B(A):
def _configure(self):
self.configured.append("B")
def setup(self):
super(B, self).setup()
self._configure()
self.set_up.append("B")
class Z(B):
pass
if __name__ == "__main__":
z = Z()
z.setup()
print "configured: %s" % z.configured
print "set up: %s" % z.set_up
运行B._configure()
两次,因此返回
me@here:~$ ./t.py
configured: ['B', 'B']
set up: ['A', 'B']
me@here:~$
而不是configured: ['A', 'B']...
.
有人可以向我解释一下吗?我应该如何确保A.setup
调用A._configure
?
解决方法:目前有效的是替换self._configure
为A._configure(self)
,但这看起来很丑陋且非 OOP:现在每个可能被继承的类都应该在每个方法调用中重复其名称?的美丽和简洁在self
哪里?