我正在尝试从字典上下文中更新类,但是字典会使用类属性的值而不是变量的“指针”实例化。
class SomeClass():
status = 0
new_entry = SomeClass()
print (new_entry.status) #prints 0 - expected
data_attribute ={
"status":[1407,new_entry.status,0]
}
data_attribute["status"][1] = 123
print (data_attribute["status"]) # prints 123 - expected
print (new_entry.status) # prints 0 - not desired
问题是我不知道如何将“指针”传递给类属性“状态”,以便在字典中对其进行更新会在主类结构中对其进行更新。我希望有些愚蠢的事情我不了解,或者我完全以错误的方式进行,但是会有所帮助。
答案 0 :(得分:0)
在Python中您无法做到这一点。 通常的选择是存储对对象的引用,并遍历该引用以获取属性。这完全不适合您编写代码的方式,只是因为Python中没有指针。
class SomeClass():
status = 0
new_entry = SomeClass()
print (new_entry.status) #prints 0 - expected
data_attribute ={
"status":[1407, new_entry, 0]
}
data_attribute["status"][1].status = 123
print (data_attribute["status"][1].status) # prints 123 - expected
print (new_entry.status) # prints 123 - OK
下面的示例可以更好地满足您的意图,但仅是为了使事情变得显而易见:
class A:
def __init__(self):
self.status = 0
a = A()
values = dict(a=a)
pointers = values
print(pointers['a'] is a)
print(pointers['a'].status)
print(a.status)
a.status = 1
print(pointers['a'].status)
pointers['a'].status = 2
print(a.status)
请注意我如何将状态存储在实例中而不是类中。实例属性在分配时会隐藏类属性。
基本上,您将字典的键用作指针。另外,您甚至不需要pointers
,因为与values
相同的对象字典仅是另一个名称。
因此,实际上是dict键充当了您想要的指针。
Python仅使用引用。任何名称都是绑定到某个对象的引用。跟踪对诸如str
或int
之类的不可变对象的引用将无法按预期进行,因为如果在前面的代码中为它们分配新值,则将创建新对象并将其绑定到相同的引用(原始对象无法更改)。