2

我是一名 Python 学习者,目前正在破解一个具有可变数量字段的类,如此处的“命名材料束”示例中所示

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

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

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

在那种情况下,我是否也应该object.__dict____init__函数中使用 replace self.__dict__

4

2 回答 2

2

您可以使用

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)
于 2011-06-10T11:38:06.520 回答
1

不,您应该将您的类定义为class Bunch(object),但继续引用self.__dict__

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

于 2011-06-10T11:27:09.990 回答