如何在Python中的类之间创建共享类属性

2024-05-14 00:14:49 发布

您现在位置: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]

但当我创建另一个B:

b = B()
b.lst  # => [] not shared when I want it to be

这不能用B中的class属性来解决,因为这不能解决下面更重要的问题

c = C()
c.lst  # => [] not shared when I want it to be

热释光;DR:我想要一个Class属性,它在两个类的每个实例之间共享。每次对其中一个实例运行generateNewList时,我都希望a.lst==b.lst==c.lst

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


Tags: 实例方法self列表属性notpasslist
1条回答
网友
1楼 · 发布于 2024-05-14 00:14:49

你需要一个静态变量。为此,使方法generateNewLst静态,并让他更新静态变量lst,而不是属于类实例而不是类本身的成员变量lst

class A:
    lst = []

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

class B(A):
    pass

class C(A):
    pass

一旦你生成了lst,你将拥有所有类的lst

a = B()
B.generateNewLst((0, 10), 3)
# the same list is available for all classes
print(A.lst) 
print(B.lst)
print(C.lst)

相关问题 更多 >