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

问题描述 投票:0回答:2

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

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 个元素的初始列表创建

class A
的实例并调用
list_len
属性,我得到:

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

[Out]: 3

但是如果我更新

my_list
list_len
属性不会改变,如果
my_list
发生变化而不调用类似
update_list_len
的方法,是否可以更新这个属性?

python class methods instance
2个回答
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
投票

你有3种方法:

方法一:每次更新

list_len
时更新
my_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:代替变量

list_len
创建一个 getter 函数,该函数将为您提供当前长度:

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
© www.soinside.com 2019 - 2024. All rights reserved.