我是一个Python学习者,目前正在攻击一个具有可变字段数量的课程 “一堆命名的东西”在这里.

class Bunch:
    def __init__(self, **kwds):
        self.__dict__.update(kwds)

我也想写一个 __setattr__ 在此类中,以检查输入属性名称。但是, Python文档 说,

如果__setAttr __()想要分配给实例属性,则不应简单地执行“ self.name = value” - 这会导致对自己的递归调用。相反,它应该在实例属性的字典中插入值,例如“ self .__ dict __ [name] = value”。对于新样式的类,而不是访问实例字典,它应该调用具有相同名称的基类方法,例如“ object .__ setAttr __(self,self,name,value)”。

在这种情况下,我也应该使用 object.__dict__ 在里面 __init__ 替换功能 self.__dict__?

有帮助吗?

解决方案

否。您应该将班级定义为 class Bunch(object), ,但继续指的是 self.__dict__.

您只需要使用 object.__setattr__ 定义的方法 self.__setattr__ 防止无限递归的方法。 __dict__ 不是一种方法,而是对象本身上的属性,因此 object.__dict__ 不起作用。

其他提示

您可以使用

class Bunch:
    def __init__(self, **kwds):
        self.__dict__.update(kwds)

    def __setattr__(self, name, value):
        #do your verification stuff
        self.__dict__[name] = value

或与新样式的课程:

class Bunch(object):
    def __init__(self, **kwds):
        self.__dict__.update(kwds)

    def __setattr__(self, name, value):
        #do your verification stuff
        super(Bunch, self).__setattr__(name, value)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top