Python:如何用普通属性替换一个属性?

6 投票
2 回答
4535 浏览
提问于 2025-04-16 11:36

基础类里面有这个:

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 个回答

1

你可以使用类似于 CachedAttribute 的东西,这个东西是通过一个描述符来实现的,具体可以参考这里的内容:为了性能提升而替换属性

(和标准的 property 不同,这种描述符可以被实例属性直接覆盖——在新式类和 Python 3 中也是如此。)

6

你可以直接给类赋值,而不是给某个实例赋值:

MyClass.management_form = property(self.myfunc)

当然,这样做会改变这个类本身,对于所有实例(包括之前已经存在的实例)都会生效。如果这样做没问题的话,你也可以只调用一次,而不是在每个子类的构造函数里都调用一次(我猜这就是你现在的做法)。

如果不想这样做,你可以按照通常的方式在子类里重写它:

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

撰写回答