关于Python新风格类的问题

2 投票
2 回答
524 浏览
提问于 2025-04-16 19:19

我正在学习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__ 是不行的。

撰写回答