【问题标题】:Python new-style-class-related questionPython new-style-class相关问题
【发布时间】:2011-09-12 10:26:12
【问题描述】:

我是一名 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] = 价值”。 对于新型类,而不是 访问实例字典,它 应该调用基类方法 同名,例如, “对象.__setattr__(自我,姓名, 值)”。

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

【问题讨论】:

    标签: python new-style-class


    【解决方案1】:

    你可以使用

    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)
    

    【讨论】:

      【解决方案2】:

      没有。您应该将您的类定义为class Bunch(object),但继续引用self.__dict__

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

      【讨论】:

      • 关于object.__dict__ 的部分或多或少是清楚的。但是,使用baseclass.__setattr__ 的原因似乎是为了调用基类中的自定义重载。我说的对吗?
      • 我不会说你在基类中调用自定义的。由于您正在重新定义“自定义重载”方法如何更新属性,因此您不能在其内部使用该方法。由于您尝试在不通过新的自定义机制的情况下更新属性,因此您可以从基类中引用它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-01
      • 1970-01-01
      • 2021-10-11
      • 2022-06-12
      • 2016-10-04
      • 2016-08-28
      相关资源
      最近更新 更多