Python:如何用常规属性替换属性?

时间:2011-02-10 21:39:02

标签: python properties

基类有:

def _management_form(self):
    # code here
    return form
management_form = property(_management_form)

在我的派生类中,我正在尝试写这个:

self.management_form = self.myfunc()

但当然它不起作用。它告诉我“无法设置属性”,因为该属性没有setter。但我不想设置它,我想重新定义“managent_form”的含义。我尝试先放del self.managent_form,但这也不起作用。那我该怎么做呢?

2 个答案:

答案 0 :(得分:6)

您可以分配给班级,而不是实例:

MyClass.management_form = property(self.myfunc)

当然,这会改变所有实例(甚至是先前存在的实例)的类本身。如果这没关系,你也可以调用它一次,而不是每个派生类构造函数(我猜你现在正在做的事情)。

否则,您可以通常的方式在派生类中覆盖它:

class MyOtherClass(MyClass):
    def _new_mf(self):
        # Better code
        return form
    management_form = property(new_mf)

答案 1 :(得分:1)

您可以使用通过描述符实现的类似Id C1 C2 C3 123 Office +65 55667788 的方法,如下所示:Replace property for perfomance gain

(与标准CachedAttribute不同,此类描述符可以由实例属性直接覆盖-在新样式类和PY3中也是如此。)