代码之家  ›  专栏  ›  技术社区  ›  Mark Harrison

Python:__setattr__用于旧式类?

  •  3
  • Mark Harrison  · 技术社区  · 10 年前

    我如何在旧样式类上执行__setattr__的等价操作?

    2 回复  |  直到 10 年前
        1
  •  2
  •   Anand S Kumar    10 年前

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

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

    对于任何类型的类,都应该使用内置函数。

        2
  •  0
  •   Cecil Curry benavente    9 年前

    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是如何允许这种淫秽的不对称性存在的,这是不值得思考的,因为它同样可怕和可耻!

    但事实的确如此。