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

2024-05-20 17:33:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个类,我希望它们能够共享一个公共列表,而不必将其作为参数传递。我还想创建一个方法来置乱这个列表,我希望这个列表在类a和类B中都是相同的新置乱的列表

我认为这是继承的一个例子,所以我创建了一个父类,将list设置为Class属性,并创建了一个方法来置乱,但奇怪的是,list变量现在被视为子类的实例变量

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变量设置为一个特定的类属性就可以解决这个问题,但这并不能解决下面更重要的问题

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

我应该如何重新组织我的设置以我想要的方式工作


Tags: 方法self列表属性notpasslistclass
3条回答

改变列表,而不是指定一个全新的值

每次你想用

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}>

self是一个实例,所以设置self.lst只在该实例上设置。要在类A上设置此变量:

A.lst = [...]

代替self.lst = [random.randint(*randomRange) for i in range(listSize)],改为:A.lst = [random.randint(*randomRange) for i in range(listSize)]

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

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

相关问题 更多 >