包含列表

时间:2018-05-27 21:52:35

标签: python list oop

我目前正在开发一个python-sqlite项目,我对两者都是新手。

我创建了一个在__init__方法中声明了一些属性的类。我需要另一个属性,它将是一个列表或数组,它将包含一些已声明的类属性。我想要的是我的列表只包含原始属性的参考。

我需要这个结构,以便能够一起调用这些属性,迭代它们,但我也希望能够单独调用它们。

首先,我尝试在其余声明之后在__init__方法中创建该列表属性。但是,当我创建一个实例并更改其中一个属性的初始值时,列表中的属性不会更新。

然后我尝试在类的另一个方法中创建相同的列表属性,而不是在 init 内部,并从我的代码中调用它,它完成了我想要的。

为什么不同的方法有不同的结果?

以下是两种情况下的代码:

案例#1

class Tools():
    def __init__(self):
        self.name = "defaultname"
        self.manufacturer = "defaultmanuf"
        self.tooldetails = [self.name, self.manufacturer]

    def get_details(self):
        return self.tooldetails

案例#2

class Tools():
    def __init__(self):
        self.name = "defaultname"
        self.manufacturer = "defaultmanuf"

    def _set_detail_list(self):
        self.tooldetails = [self.name, self.manufacturer]

    def get_details(self):
        _set_detail_list()
        return self.tooldetails

当我创建一个实例时:

tool1 = Tools()
tool1.name = 'abc'
tool1.get_details()

第一个案例给了我["defaultname", "defaultmanuf"],而第二个案例给了我["abc","defaultmanuf"]

我的问题是python为每个案例提供不同输出的原因是什么?似乎我错过了关于初始化如何工作的重要信息。

dir()和其他类似的函数或魔术方法可以给我我想要的东西,但我认为如果你想要许多具有不同属性集的不同列表,它们就不够灵活。不幸的是,内省对于sqlite字符串格式的命令并不能很好地工作..

另外我很好奇python的工作方式,我认为这非常重要。

谢谢!

1 个答案:

答案 0 :(得分:0)

案例#1

当您的列表在__init__内创建时,它包含指向2个字符串的指针。但是,一旦创建了列表,nametooldetails之间的链接就会不可逆转地被破坏。如果您更新nametooldetails将无法动态更新,除非您告诉Python使用新数据明确更新tooldetails

案例#2

在这里,您明确地告诉Python通过tooldetails内的_set_detail_list方法重建get_details。您更新name然后告诉Python重建tooldetails列表。因此,如果您更新name后跟get_details,则会更新您的列表。