我是一名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__
?
答案 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__
不起作用。