我有一个变量
self.foo = 1
和一本字典
self.foo_dict = {
'foo_key' = self.foo
}
我希望能够更改self.foo
的值,并将其更改为self.foo_dict
。如果这是在C(并且dict是结构),我只使用指针。
有什么建议吗?这在Python中是否可行?
答案 0 :(得分:4)
这在Python中是否可行?
回答1 :不是直截了当的,因为int
是不可变的。然而...
回答2 :有实现所需目标的解决方法。
而不是int
用于变量foo
,您需要为foo
设置包装类,因为int
是不可变的,你定义的任何包装器类都不是。
foo
的包装类:
class Foo:
def __init__(self, val):
self.foo = val
def set(self, val):
self.foo = val
def __repr__(self):
return str(self.foo)
然后,您拥有一致变量字典对的类可能是这样的:
class A:
def __init__(self):
self.foo = Foo(1)
self.foo_dict = {
'foo_key': self.foo
}
def set_foo(self, newval):
self.foo.set(newval)
试运行:
>>> a = A()
>>> a.foo
1
>>> a.foo_dict['foo_key']
1
>>> a.set_foo(20)
>>> a.foo
20
>>> a.foo_dict['foo_key']
20
答案 1 :(得分:4)
不需要包装类!
只需使self.foo
成为访问字典中值的属性:
class Bar:
def __init__(self, foo_):
self.foo_dict = {}
self.foo = foo_
@property
def foo(self):
return self.foo_dict["foo_key"]
@foo.setter
def foo(self, value):
self.foo_dict["foo_key"] = value
def show(self):
print("foo={} ; foo_dict['foo_key']={}".format(
self.foo, self.foo_dict["foo_key"]))
b = Bar(1)
b.show()
b.foo = 2
b.show()
b.foo_dict["foo_key"] = 3
b.show()
See this code running on ideone.com
属性像普通实例成员字段一样向外看,但它们实际上是可以执行任何操作的自定义函数。这样,在访问foo(...)
属性时会调用两个foo
方法。用@property
装饰的那个是吸气剂,用@PROPERTYNAME.setter
装饰的那个显然是制定者。您还可以通过省略其中一个属性方法来限制对属性的读取或写入访问。
在这里,他们将所有操作重定向到字典。这样,您只有一个简单的可变变量的实例,但有多种方法可以访问它。
上面的示例将导致此输出:
foo=1 ; foo_dict['foo_key']=1
foo=2 ; foo_dict['foo_key']=2
foo=3 ; foo_dict['foo_key']=3
正如我们所看到的,无论我们是改变字典中的值还是通过属性,两个名字总是指向同一个变量。
答案 2 :(得分:1)
>>> class Test(object):
def __init__(self,foo):
self.foo = foo
self.foo_dict = {'foo_key': foo}
def set_foo(self, foo):
self.foo = foo
self.foo_dict['foo_key'] = foo
>>> a = Test(1)
>>> a.foo
1
>>> a.foo_dict
{'foo_key': 1}
>>> a.set_foo(2)
>>> a.foo
2
>>> a.foo_dict
{'foo_key': 2}
>>>
答案 3 :(得分:-1)
我没有完全理解你的问题但是如果你想改变self.foo
的值,你可以直接使用字典来完成。假设你有一些字典:
self.some_dict = {"valueA":1}
考虑到字典按key
到value
对运行,您可以像这样更改valueA
的值:
self.some_dict["valueA"] = some_value
因此,密钥的值更改为some_value
。作为另一种可能性,您可以使用dict.copy
创建字典的副本。有了这个,你有另一个字典与第一个字符的值相同,然后用dict.update
更新以在键中添加新的元素或值。像这样:
self.some_dict = {"value1":1}
self.other_dict = some_dict
self.other_dict.update("{"value2": 2}")
使用此功能,您可以将value2
更新为other_dict。