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

如何在python中重写属性函数的setter和getter?

  •  -1
  • adnanmuttaleb  · 技术社区  · 6 年前

    我使用property函数创建成员,但是当我试图重写那些属性的setter和getter时,它总是引用父类的setter和getter:

    class A():
        def evaluate(self):
            return 'A'
        value = property(evaluate)
    
    class B(A):
        def evaluate(self):
            return 'B'
    
    b = B()
    print(b.value) # I get 'A'
    

    我尝试将值成员的定义放在父级的构造函数中,例如:

    self.value = property(self.evaluate)
    

    <property object at 0x7fecd01a88b8>
    

    我知道如何解决这个问题,但我想知道是否有可能解决它使用属性函数/修饰符和没有代码重复。

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

    property(evaluate) 将属性绑定到 evaluate 当类的主体 A 评价

    这是可行的,但如果我们知道你为什么要这么做,可能有更好的方法:

    class A():
        def evaluate(self):
            return 'A'
        value = property(lambda self: self.evaluate())
    
    class B(A):
        def evaluate(self):
            return 'B'
    
    b = B()
    print(b.value) # prints 'B'
    

    如果您只想返回一个不同的常量字符串 A B 那么你根本不需要房产:

    class A():
       value = 'A'
    
    class B(A):
       value = 'B'
    
    b = B()
    print(b.value)
    

    class A():
       @property
       def value(self):
           return 'A'
    
    class B(A):
       @property
       def value(self):
           return 'B'
    
    b = B()
    print(b.value)