我有两个类,我希望他们能够共享一个公共列表,而不必将其作为参数传递。我还想创建一个可以对该列表进行加扰的方法,并且希望该列表在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
我应该如何重组我的设置,使其以我想要的方式工作?
答案 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}>