Python:__ setattr__用于旧式类?

时间:2015-09-23 01:20:32

标签: python legacy-code

如何在旧式类上执行__setattr__的等效操作?

2 个答案:

答案 0 :(得分:2)

如果你想要做的是设置旧样式类实例的属性,你可以使用setattr内置函数,它也适用于旧式类。示例 -

>>> class Foo:
...     def __init__(self,blah):
...             self.blah=blah
... 
>>> foo = Foo("Something")
>>> foo.blah
'Something'
>>> setattr(foo,'blah','somethingElse')
>>> foo.blah
'somethingElse'

您应该使用内置函数,例如任何类型的类。

答案 1 :(得分:0)

由于original question接受“...等效方法”,我想展示在旧式类中实现特殊__setattr__()方法的正确方法。

TL;博士

在旧式课程的self.__dict__[attr_name] = attr_value方法中使用__setattr__(self, attr_name, attr_value)

__setattr__()遇见旧式班级

有趣的是,Python 2.7和3 调用旧式类定义的__setattr__()方法。但是,与新式类不同,旧式类不提供默认的__setattr__()方法。令人惊讶的是,这在旧式类中使__setattr__()方法变得非常复杂。

在新式类的子类__setattr__()中,通常在末尾调用超类__setattr__()来设置所需的属性。在旧式类的子类__setattr__()中,这通常会引发异常;在大多数情况下, 没有超类__setattr__()。相反,必须手动设置特殊__dict__实例变量的所需键值对。

示例或它没有发生

考虑一个伟大的旧式类,类似于“有千千万万的伍兹的黑山羊”,并定义__setattr__()la_为通过的属性名称加前缀:

class ShubNiggurath:
    def __setattr__(self, attr_name, attr_value):
        # Do not ask why. It is not of human purport.
        attr_name = 'la_' + attr_name

        # Make it so. Do not call
        # super(ShubNiggurath, self).__setattr__(attr_name, attr_value), for no
        # such method exists.
        self.__dict__[attr_name] = attr_value

黑暗中的不对称

奇怪的是,旧式类提供了默认的__getattr__()方法。 Python 2.7如何允许这种淫秽的不对称行为不值得思考 - 因为它同样是可怕和可耻的!

但确实如此。

相关问题