如何从dict继承的类中自动更新密钥



我有一个从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

最新更新