关于Python新风格类的问题
我正在学习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)”。
那么,在__init__
函数里,我是否也应该用object.__dict__
来替代self.__dict__
呢?
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)
1
不可以。你应该把你的类定义为 class Bunch(object)
,但继续使用 self.__dict__
。
在你定义 self.__setattr__
方法的时候,只有在那时需要使用 object.__setattr__
方法,这样可以避免无限循环。__dict__
不是一个方法,而是对象本身的一个属性,所以 object.__dict__
是不行的。