在Python

时间:2018-04-29 02:48:51

标签: python class inheritance derived

在这种情况下,类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方法来解决这个问题?

1 个答案:

答案 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)

现在bc都共享A的单个实例,并且通过这两个对象都可以看到对该共享实例的更改。