繁体   English   中英

Python:__ setattr__用于旧式类?

[英]Python: __setattr__ for old-style classes?

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

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

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

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

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

TL;博士

__setattr__(self, attr_name, attr_value)方法中使用self.__dict__[attr_name] = attr_value

__setattr__()符合旧式班级

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

在子类__setattr__()一个新式类的,超__setattr__()通常被称为在端部,设置所需的属性。 __setattr__()类的子类__setattr__()中,这通常会引发异常; 在大多数情况下, 没有__setattr__() 相反,必须手动设置特殊__dict__实例变量的所需键值对。

示例或它没有发生

考虑一个伟大的旧式类,类似于“有__setattr__()的伍兹的黑山羊”这个短语,并定义__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如何允许这种淫秽不对称的立场不值得思考 - 因为它同样是可怕和可耻的!

但它是。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM