如何在继承的实例之间共享类变量?

时间:2019-09-29 05:07:36

标签: python

我有两个类,我希望他们能够共享一个公共列表,而不必将其作为参数传递。我还想创建一个可以对该列表进行加扰的方法,并且希望该列表在A类和B类中都是相同的新加扰列表。

我认为这是继承的一种情况,所以我创建了一个父类,并将列表设置为类属性,并设置了加扰的方法,但是列表变量现在足以作为子级的实例变量了。

class A:
    lst = []
    target = 0

    def generateNewLst(self, randomRange, listSize):
        self.lst = [random.randint(*randomRange) for i in range(listSize)]

class B(A):
    pass

class C(A):
    pass

我继承的方法工作正常:

a = B()
a.generateNewLst((0, 10), 3)
a.lst  # => [2,5,7]

但是当我创建另一个A:

b = B()
b.lst  # => [] not shared

我知道可以通过仅将我的lst变量设置为A特定的类属性来解决此问题,但这不能解决下面更重要的问题...

c = C()
c.lst  # => [] not shared

我应该如何重组我的设置,使其以我想要的方式工作?

3 个答案:

答案 0 :(得分:0)

self是一个实例,因此设置self.lst仅在该实例上设置。您想在类A上设置此变量:

A.lst = [...]

答案 1 :(得分:0)

尝试代替self.lst = [random.randint(*randomRange) for i in range(listSize)],而不是A.lst = [random.randint(*randomRange) for i in range(listSize)]

在进行self.lst = ...时,您正在创建一个名为lst的实例变量,该变量现在是特定于实例的,因此无法共享。

类似地,您应该执行b.lst = [],而不是执行A.lst = []

答案 2 :(得分:0)

更改该列表,而不是分配一个全新的值。

每次都要使用

b.lst = ...something...

改为使用此

b.lst[:] = ...something...

另一种方法是使用property,但它会破坏A.lst

class A:
    target = 0
    _lst = []
    @property
    def lst(self):
        return A._lst
    @lst.setter
    def lst(self, value):
        A._lst[:] = value
    def generateNewLst(self, randomRange, listSize):
        self.lst = [random.randint(*randomRange) for i in range(listSize)]

class B(A):
    def __init__(self):
        super()

a=A()
a.lst = [1]
b=B()
b.lst  # [1]
A.lst  # <property object at 0x{some random-ish hex number}>