【问题标题】:Python: How to replace a property with a regular attribute?Python:如何用常规属性替换属性?
【发布时间】:2011-06-25 04:24:51
【问题描述】:

基类有这个:

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

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

self.management_form = self.myfunc()

但它当然行不通。它告诉我“无法设置属性”,因为该属性没有设置器。但我不想设置它,我想重新定义“managent_form”的含义。我尝试将del self.managent_form 放在首位,但这也不起作用。那么如何取消属性化呢?

【问题讨论】:

  • 你确定这是个好主意吗?这听起来像是打破了一种关系......
  • 好吧,定义属性的方式,每次使用它时都会重建对象,这很愚蠢。我在那里放了一个打印语句,它被调用了 10 次,它会导致问题,因为我需要修改它的一些属性,但是如果下次使用它时要被替换它是徒劳的。我不知道他们(Django 开发人员)为什么这样做。基本上,我只希望它构建一次,然后从那时起返回该实例。

标签: python properties


【解决方案1】:

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

MyClass.management_form = property(self.myfunc)

当然,这会更改所有实例(甚至是预先存在的实例)的类本身。如果没问题,您也可以只调用一次,而不是在每个派生类构造函数中调用它(我猜这就是您现在正在做的)。

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

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

【讨论】:

  • 我想重写它以返回属性就足够了......有点奇怪,你可以取消它的属性。 Python 中的其他一切都是完全可变的。
【解决方案2】:

您可以使用类似 CachedAttribute 的东西,通过如下所示的描述符实现:Replace property for perfomance gain

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-07
    • 2015-08-25
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    相关资源
    最近更新 更多