如何从dict继承的类中自动更新键?

2024-04-25 17:49:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个从dict类继承的类。在下面的示例中,我用默认值定义了两个键“x”和“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)

我发现了一篇文章,解释了类属性的解决方案:In class object, how to auto update attributes?

但是,我找不到一种方法来扭曲这个示例,使其适用于字典键。有人知道怎么做吗

谢谢


Tags: self示例定义init链接def方式myclass
1条回答
网友
1楼 · 发布于 2024-04-25 17:49:28

对于子类,建议使用来自collections.UserDict的子类,而不是dict。使用UsedDict,所有内容都存储在data变量中Manual pages here

对于所需的功能,您可以重新定义__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

相关问题 更多 >