我希望创建一个在类中具有其他值的列表,并确保该列表是最新的,而不必自己更新。
我试图这样写:
class Test:
def __init__(self, arg, arg2):
self.arg = arg
self.arg2= arg2
self.list = [self.arg, self.arg2] #list I want up to date
def update(self, arg, arg2):
self.arg = arg
self.arg2 = arg2
#the simple answer is to add: self.list=[self.arg, self.arg2] or a function doing it. That is not what I am asking.
def write_list(self):
print(self.list)
tes = Test(1, 2)
tes.write_list()
tes.update(23,24)
tes.write_list()
我希望输出为:
[1,2]
[23,24]
答案 0 :(得分:1)
int
是不可变的。因此,当您在更新方法中执行self.arg=arg
时,self.list
仍将指向旧值。
我建议创建一个Pointer
类来存储您的整数,并使用更新方法来更改值:
class Test:
def __init__(self, arg, arg2):
self.arg = Pointer(arg)
self.arg2= Pointer(arg2)
self.list = [self.arg, self.arg2]
def update(self, *args):
for pointer, val in zip(self.list, args):
pointer.update(val)
def write_list(self):
print (self.list)
class Pointer:
def __init__(self, num):
self.num = num
def update(self, num):
self.num = num
def __repr__(self):
return repr(self.num)
tes = Test(1, 2)
tes.write_list()
tes.update(23,24)
tes.write_list()
#[1, 2]
#[23, 24]
答案 1 :(得分:0)
一种替代方法是使用属性,其中lst
模仿传统属性,但实际上是在运行时重新创建的。但是,由于每次您访问test_instance.lst
时都会重新创建列表,因此效率低下。
class Test:
def __init__(self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
@property
def lst(self):
return [self.arg1, self.arg2]
def update(self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
def write_list(self):
print(self.lst)
tes = Test(1, 2)
tes.write_list()
tes.update(23,24)
tes.write_list()
# Output:
# [1, 2]
# [23, 24]
至少在示例代码中,另一个选择就是从.lst
内部更新.update()
属性:
class Test:
def __init__(self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
self.lst = [arg1, arg2]
def update(self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
self.lst = [arg1, arg2]
def write_list(self):
print(self.lst)
tes = Test(1, 2)
tes.write_list()
tes.update(23,24)
tes.write_list()