题
我是一个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)
不隶属于 StackOverflow