2011-06-10 116 views
2

我是一名python学习者,目前正在用"Bunch of Named Stuff" example here来攻击可变数量字段的类。Python新式相关问题

class Bunch: 
    def __init__(self, **kwds): 
     self.__dict__.update(kwds) 

我也想写此一等级__setattr__,以检查输入属性名称。但是,在python documentation说,

如果__setattr __()要分配给 实例属性,它不应该 简单地执行“self.name =价值” - 这 会导致递归调用 本身。相反,它应该将 值插入实例 属性的字典中,例如“self .__ dict __ [name] = value”。 对于新型类,而不是 访问实例字典,它 应该调用基类的方法与 相同的名称,例如, “对象.__ SETATTR __(个体,名称, 值)”。

在这种情况下,是否也应该使用object.__dict____init__功能,以取代self.__dict__

回答

1

不可以。您应该将您的班级定义为class Bunch(object),但请继续参考self.__dict__

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

+0

约'对象.__ dict__'或多或少是明确的部分。然而,使用'baseclass .__ setattr__'的原因似乎是调用基类中的自定义重载。我对吗? – 2011-06-10 11:41:02

+0

我不会说你在基类中调用自定义的。由于您正在重新定义“自定义重载”方法更新属性的方式,因此您无法在其内部使用该方法。由于您试图在不通过新的自定义机制的情况下更新属性,因此您可以从基类中引用它。 – 2011-06-10 11:44:45

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)