代码之家  ›  专栏  ›  技术社区  ›  abc

__设置属性的setattr\uv类属性

  •  2
  • abc  · 技术社区  · 6 年前

    考虑以下两个类定义,在第一个类定义中,为了在将值赋给属性之前进行额外的检查(例如,跟踪修改的变量、检查有效性等),我重写 __setattr__ 方法,在第二个方法中我使用属性。

    class A(object):
        def __init__(self, x):
            self.x = x
    
        def __setattr__(self, name, value):
            # do something
            self.__dict__[name] = value
    
    class B(object):
        def __init__(self, x):
            self.x = x
    
        @property
        def x(self):
            return self.x
    
        @x.setter
        def x(self, v):
            # do something
            self.x = v
    

    在我看来,他们的行为方式是一样的。

    1 回复  |  直到 6 年前
        1
  •  2
  •   chepner    6 年前

    __setattr__ 是更一般的,因为它将运行 A().foo = 3 foo 你提供。属性设置器特定于单个显式定义的属性,不能用于“意外”创建属性。