Python 通过 object.attribute 从构造函数更新列表

Python updating list from constructor by object.attribute

提问人:TheRi 提问时间:10/7/2022 最后编辑:TheRi 更新时间:10/7/2022 访问量:82

问:

如果使用属性创建类:name 和 list,并且 name 属性具有默认值,并且列表将追加该名称。当我创建一个对象“a”并键入时,是否有可能 “a.name = 'x' ” 这个 'x' 将出现在列表中,因为列表正在附加在构造函数中?

class Person:
    list = []
    def __init__(self, name="Zed"):
        self.name = name
        self.list.append(name)

    def printList(self):
        print(self.list)


a = Person()
a.name = "Yasuo"
a.printList() #outputs Zed but Yasuo is expected.
列表 构造 函数 附加 可变

评论


答:

1赞 Barmar 10/7/2022 #1

您可以创建一个属性,并实现更新列表的 setter。name

class Person:
    list = []
    def __init__(self, name="Zed"):
        self._name = name
        self.list.append(name)
    @property
    def name(self):
        return self._name
    @name.setter
    def name(self, name):
        if self._name in self.list:
            # remove the old name
            index = self.list.index(self.name)
            self.list[index] = name
        else:
            self.list.append(name)
        self._name = name
    def printList(self):
        print(self.list)

a = Person()
a.name = "Yasuo"
a.printList() # prints ['Yasuo']

评论

0赞 TheRi 10/7/2022
我同意你的看法,但我不知道他们为什么希望我们在 __init__() 下的附加项中这样做,我认为这很愚蠢。他们还希望在我们执行“a.name”时覆盖“Zed”,以便在这种情况下,a.printList() 打印列表中没有 Zed 的 Yasuo。
0赞 TheRi 10/7/2022
我试着把清单放在班级下面的身体上,但还是没用......在这种情况下,列表是默认的可变属性并且应该以不同的方式实现它是否有关?我认为这非常令人困惑......
0赞 Barmar 10/7/2022
如果他们想替换而不是附加,为什么它是一个列表?
0赞 Barmar 10/7/2022
我已更改答案以替换为新名称。self.list[0]
0赞 Barmar 10/7/2022
您确定应该是实例属性而不是类属性吗?也许他们想要一个所有实例的列表,或者所有人的名字列表?list