我目前正在开发一个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的工作方式,我认为这非常重要。
谢谢!
答案 0 :(得分:0)
案例#1
当您的列表在__init__
内创建时,它包含指向2个字符串的指针。但是,一旦创建了列表,name
和tooldetails
之间的链接就会不可逆转地被破坏。如果您更新name
,tooldetails
将无法动态更新,除非您告诉Python使用新数据明确更新tooldetails
。
案例#2
在这里,您明确地告诉Python通过tooldetails
内的_set_detail_list
方法重建get_details
。您更新name
和然后告诉Python重建tooldetails
列表。因此,如果您更新name
后跟get_details
,则会更新您的列表。