Python新风格相关的问题

时间:2011-06-10 11:22:57

标签: python new-style-class

我是一名python学习者,目前正在使用"Bunch of Named Stuff" example here中包含可变数量字段的类。

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

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

  

如果__setattr __()想要分配给   实例属性,它不应该   只需执行“self.name = value” -   这会导致递归调用   本身。相反,它应该插入   实例字典中的值   属性,例如“self .__ dict __ [name]   =值“。   对于新式的课程,而不是   它访问实例字典   应该调用基类方法   例如,同名   “object .__ setattr __(self,name,   值)”。

在这种情况下,我是否还应该使用object.__dict__函数中的__init__来替换self.__dict__

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

没有。您应该将班级定义为class Bunch(object),但请继续参考self.__dict__

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