使用property()函数时为什么不调用setter?

时间:2015-01-22 18:31:24

标签: python getter-setter python-2.x accessor

我有以下简单的python类,它使用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)

当我实例化这个类并使用getter时,它可以正常工作:

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

然而,当我尝试使用setter时,它似乎根本没有被调用。来自setter中的print语句永远不会触发:

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

为什么getter工作但不是setter?为什么没有错误?如何让setter工作为advertised

2 个答案:

答案 0 :(得分:3)

属性需要在 新样式 类上才能正常运行。不要忘记继承object

class MyClass(object):  # !
    ...

答案 1 :(得分:1)

您需要使用新式的课程:

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)

在Python 3中,新样式类是您可以使用的唯一样式,但您明确使用2.x(print是一个声明)。要获得新式语义,您必须继承object