2011-02-10 6 views
5

基底クラスがこれを持っている:私の派生クラスでPython:プロパティを通常の属性に置き換えるにはどうすればいいですか?

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

、私はこの書き込みをしようとしています:

self.management_form = self.myfunc() 

をしかし、もちろん、それは動作しません。そのプロパティにはセッターがないため、「属性を設定できません」と表示されます。しかし、私はそれを設定したくない、私は "managent_form"が何を意味するかを再定義したい。私は最初にdel self.managent_formを入れてみましたが、それもうまくいきませんでした。だから私はどのようにプロパティをプロパティを解除するのですか?

+0

はあなたにそれは良いアイデアだと確信していますか?それは、is-aの関係を破るように聞こえます。 – delnan

+0

プロパティが定義されているように、使用するたびにオブジェクトを再構成します。これは単にばかげたものです。私はそこにprintステートメントを入れて、それは10回のように呼び出されます。そのプロパティのいくつかを変更する必要があるので問題を引き起こしますが、次回にそのプロパティが使用されると無駄になります。なぜ彼ら(Django開発者)がこれを好きにしたのかはわかりません。基本的には、一度構築してからそのインスタンスを戻すだけです。 – mpen

答えて

6

あなたが代わりにインスタンスのクラスに割り当てることができます:もちろん

MyClass.management_form = property(self.myfunc) 

を、これはすべてのインスタンス(でも、既存のもの)のためのクラス自体を変更します。これがOKであれば、派生クラスのすべてのコンストラクタではなく、正確に1回呼び出すこともできます(これは私が今やっていることです)。

そうでなければ、それは通常の方法で派生クラスでオーバーライドすることができます。

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

私はプロパティを返すだけでそれをオーバーライドするのは十分だと思う。 Pythonの他のすべては完全に変更可能です。 – mpen

関連する問題