为什么在使用 属性() 函数时 setter 没有被调用?

Why doesn't setter get called when using property() function?

我有以下简单的 python class,它使用 property 函数定义了 getter 和 setter:

class MyClass():

    def get_my_var(self):
        print "In get_my_var()"
        return None

    def set_my_var(self, value):
        print "In set_my_var()"
        return

    my_var = property(get_my_var, set_my_var)

当我实例化此 class 并使用 getter 时,它按预期工作得很好:

>>> x = MyClass()
>>> print "x.my_var = %s" % x.my_var
In get_my_var()
x.my_var = None

然而,当我尝试使用 setter 时,它似乎根本没有被调用。 setter 中的打印语句从不触发:

>>> print "About to do 'x.my_var = 5'"
About to do 'x.my_var = 5'
>>> x.my_var = 5
>>>

为什么 getter 有效而 setter 无效?为什么没有任何错误?我如何让 setter 像 advertised 一样工作?

属性需要 新样式 类 才能正常工作。不要忘记继承自 object!

class MyClass(object):  # !
    ...

您需要使用新样式class:

class MyClass(object):

    def get_my_var(self):
        print "In get_my_var()"
        return None

    def set_my_var(self, value):
        print "In set_my_var()"
        return

    my_var = property(get_my_var, set_my_var)

在Python3中,新的样式classes是你唯一可以使用的样式,但你显然在使用2.x(print是声明) .要获得新式语义,您必须继承自 object.