在这种情况下,类A是类B和C的父类。目标是在实例b和c之间共享状态。它不是关于添加或覆盖函数,而是关于状态值a
。
class A():
def __init__(self):
self.a ='a'
print('@a')
class B(A):
def __init__(self):
A.__init__(self)
self.x = 'b'
class C(A):
def __init__(self):
A.__init__(self)
self.x = 'c'
b = B()
c = C()
print(b.a, b.x)
print(c.a, c.x)
输出
@a
@a
a b
a c
我理解为什么会这样; A中的__init__()
被调用两次。我可以进行测试,因此它只设置初始值一次,但这似乎不是一个非常优雅的解决方案。另外,它只允许共享一个A实例。如果我希望在B和C的另外两个实例之间共享另一个A实例,则无法完成。在模块中使a
全局化并完全摆脱A类也是如此。是否有一种好的Pythonic方法来解决这个问题?
答案 0 :(得分:0)
同意abarnert:这没有任何意义。这不是继承的含义。
继承意味着每个B实例都是一个A实例,而每个C实例都是一个A实例。 B实例没有单独的A实例,它当然不能与C实例共享。
如果你想让B和C对象拥有一个A实例,并拥有相同的 A实例,那么你需要组合:
class A(object):
def __init__(self):
self.state = whatever()
self.other_state = more_stuff()
class B(object):
def __init__(self, a):
self.a = a
class C(object):
def __init__(self, a):
self.a = a
a = A()
b = B(a)
c = C(a)
现在b
和c
都共享A
的单个实例,并且通过这两个对象都可以看到对该共享实例的更改。