如何在旧式类上执行__setattr__的等效操作?
答案 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__()
方法的正确方法。
在旧式课程的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如何允许这种淫秽的不对称行为不值得思考 - 因为它同样是可怕和可耻的!
但确实如此。