Python:如何用普通属性替换一个属性?
基础类里面有这个:
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)