我有一个从dict
类继承的类。在下面的例子中,我用默认值定义了两个键"x"one_answers"x2">
class myClass(dict):
def __init__(self,*arg,**kw):
super(myClass, self).__init__(*arg, **kw)
self['x']=2
self['x2']=self['x']*self['x']
我希望它们以这样的方式链接:如果我修改'x'
,'x2'
由x*x
更新,如果我修改了'x2'
,则'x'
更新为sqrt(x)
我发现一篇文章解释了一种针对类属性的解决方案:在类对象中,如何自动更新属性?
然而,我找不到一种方法来扭曲这个例子,使其适用于字典键。有人知道怎么做吗?
谢谢!
对于子层,建议使用collections.UserDict
中的dictionary子层,而不是dict
。使用UsedDict,您的所有内容都存储在data
变量中。此处为手册页。
对于所需的功能,您可以重新定义__setitem__
特殊方法:
import math
from collections import UserDict
class myClass(UserDict):
def __init__(self,*arg,**kw):
super(myClass, self).__init__(*arg, **kw)
self.data['x'] = 2
self.data['x2']= self['x'] * self['x']
def __setitem__(self, key, value):
super().__setitem__(key, value)
if key == 'x':
self.data['x2'] = value * value
elif key == 'x2':
self.data['x2'] = math.sqrt(value)
c = myClass()
print(c['x'])
print(c['x2'])
print('-' * 80)
c['x'] = 4
print(c['x'])
print(c['x2'])
print('-' * 80)
c['x2'] = 9
print(c['x'])
print(c['x2'])
输出:
2
4
--------------------------------------------------------------------------------
4
16
--------------------------------------------------------------------------------
4
3.0