首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python子类中的RecursionError

python子类中的RecursionError
EN

Stack Overflow用户
提问于 2018-02-05 23:21:19
回答 1查看 262关注 0票数 0

我编写了继承dict内置类型的python类。我想编写一种带有额外检查方法的容器。

如果我创建该类的一个实例,就会得到一个RecursionError。我不明白这个错误。

代码语言:javascript
复制
class Params(dict):
    """ A convenient container of all paramters """

    # list of authorized keywords with default values
    keywords = {"k1": 1, "k2": 2, "k3": 3}

    def __init__(self, *args, **kwargs):
        # self.update(self.keywords)
        for k, v in self.keywords.items():
            self[k] = v
        self.update(*args, **kwargs)

    def update(self, *args, **kwargs):
        for k, v in dict(*args, **kwargs).items():
            self[k] = v

    def __setitem__(self, name, value):
        """ set a parameters following dict syntax """
        name = name.lower()
        if name in self.keywords:
            self[name] = value
        else:
            raise KeyError("Keywords %s does not exist." % name)

    def __getattr__(self, name):
        """ get paramters as an attribute of the class """
        return self.__getitem__(name)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-05 23:45:31

因此,正如我在注释中所暗示的,发生递归错误是因为您在self.__setitem__中隐含地调用__setitem__,因此应该调用超类__setitem__。有一种方法:

代码语言:javascript
复制
In [6]: class Params(dict):
   ...:     """ A convenient container of all paramters """
   ...:
   ...:     # list of authorized keywords with default values
   ...:     keywords = {"k1": 1, "k2": 2, "k3": 3}
   ...:
   ...:     def __init__(self, *args, **kwargs):
   ...:         # self.update(self.keywords)
   ...:         for k, v in self.keywords.items():
   ...:             self[k] = v
   ...:         self.update(*args, **kwargs)
   ...:
   ...:     def update(self, *args, **kwargs):
   ...:         for k, v in dict(*args, **kwargs).items():
   ...:             self[k] = v
   ...:
   ...:     def __setitem__(self, name, value):
   ...:         """ set a parameters following dict syntax """
   ...:         name = name.lower()
   ...:         if name in self.keywords:
   ...:             # note: dict.__setitem__(self, name, value) would also work
   ...:             super().__setitem__(name, value)
   ...:         else:
   ...:             raise KeyError("Keywords %s does not exist." % name)
   ...:
   ...:     def __getattr__(self, name):
   ...:         """ get paramters as an attribute of the class """
   ...:         return self.__getitem__(name)
   ...:

In [7]: p = Params(k1=10)

In [8]: p
Out[8]: {'k1': 10, 'k2': 2, 'k3': 3}

注意,我使用了Python3版本的super Python 2将需要:super(Params, self).__setitem__(name, value)

注意,一般来说,我更喜欢组合而不是继承。拥有一个具有内部dict属性的dict对象,您可以通过公共接口管理该对象。这将更加健壮,并避免从内置类型继承带来的麻烦。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48633099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档