Python __设置属性的setattr_u; vs类属性

Python __设置属性的setattr_u; vs类属性,python,class,methods,Python,Class,Methods,考虑以下两个类定义,为了在为属性赋值之前进行额外检查(例如,跟踪修改的变量、检查有效性等),在第一个类定义中,我覆盖\uuu setattr\uuuu方法,在第二个类定义中,我使用属性 class A(object): def __init__(self, x): self.x = x def __setattr__(self, name, value): # do something self.__dict__[name] =

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

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
在我看来,他们的行为方式是一样的。

这两者有什么区别吗?应该首选哪一个以及原因?

\uuuu setattr\uuuu
更一般,因为它将为
A().foo=3
运行,而不管您提供什么属性
foo
。属性设置器特定于单个显式定义的属性,不能用于“意外”创建属性