是否可以仅通过更改一个属性来更新类实例中的所有属性?

Is it possible to update all attributes in class instance by changing just one attribute?

提问人:Curious 提问时间:9/7/2023 更新时间:9/7/2023 访问量:35

问:

我想更新我类中的所有属性,如果我更改至少一个属性,这是我的示例:Python

class A:
    def __init__(self, my_list):
        self.my_list = my_list
        self.list_len = len(self.my_list)
    def update_list(self, var1):
        self.my_list.append(var1)

如果我创建一个包含 3 个元素和 call 属性的初始列表的实例,我会得到:class Alist_len

a_instance = A([1,2,3])
a_instance.list_len

[Out]: 3

但是如果我更新,属性保持不变,如果在不调用类似方法的情况下更改,是否可以更新此属性?my_listlist_lenmy_listupdate_list_len

Python 方法 实例

评论


答:

1赞 Andrej Kesely 9/7/2023 #1

您可以将 转换为 :list_len@property

class A:
    def __init__(self, my_list):
        self.my_list = my_list

    @property
    def list_len(self):
        return len(self.my_list)


a_instance = A([1, 2, 3])
print(a_instance.list_len)

a_instance.my_list.append(4)
print(a_instance.list_len)

指纹:

3
4
0赞 jurez 9/7/2023 #2

您有 3 种方法:

方法 1:每当您更新 .这通常不是最好的方法,因为你浪费了一个变量只是为了复制一个在其他地方已经可用的值。list_lenmy_list

class A:
    def __init__(self, my_list):
        self.my_list = my_list
        self.list_len = len(my_list)

    def update_list(self, var1):
        self.my_list.append(var1)
        self.list_len = len(self.my_list)

a_instance = A([1, 2, 3])
print(a_instance.list_len)  # Prints 3
a_instance.update_list([1, 2, 3, 4, 5])
print(a_instance.list_len)  # Prints 5

方法 2:而不是变量,创建一个 getter 函数,该函数将为您提供当前长度:list_len

class A:
    def __init__(self, my_list):
        self.my_list = my_list

    def update_list(self, var1):
        self.my_list.append(var1)

    def list_len(self):
        return len(self.my_list)

a_instance = A([1, 2, 3])
print(a_instance.list_len())  # Prints 3
a_instance.update_list([1, 2, 3, 4, 5])
print(a_instance.list_len())  # Prints 5

方法 3(最好):使用 getter 属性,它与方法 2 类似,但带有一点语法糖:

class A:
    def __init__(self, my_list):
        self.my_list = my_list

    def update_list(self, var1):
        self.my_list.append(var1)

    @property
    def list_len(self):
        return len(self.my_list)

a_instance = A([1, 2, 3])
print(a_instance.list_len)  # Prints 3
a_instance.update_list([1, 2, 3, 4, 5])
print(a_instance.list_len)  # Prints 5