代码之家  ›  专栏  ›  技术社区  ›  Saqib Ali

为什么在使用property()函数时不调用setter?[副本]

  •  0
  • Saqib Ali  · 技术社区  · 11 年前

    我有以下简单的python类,它使用 property 功能:

    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
    >>>
    

    为什么吸气剂起作用,但设置器不起作用?为什么没有错误?我如何让二传手作为 advertised ?

    2 回复  |  直到 11 年前
        1
  •  3
  •   mgilson    11 年前

    属性需要打开 新样式 类才能正常工作。别忘了继承 object !

    class MyClass(object):  # !
        ...
    
        2
  •  1
  •   Kevin    11 年前

    您需要使用一个新的类:

    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中,新样式类是唯一可以使用的样式,但显然使用的是2.x( print 是陈述)。要获得新型语义,必须继承自 object .

    推荐文章