2011-02-10 28 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

你確定這是個好主意嗎?這聽起來像是打破了一個關係...... – delnan 2011-02-10 21:42:05

+0

那麼,物業的定義方式,它每次使用它重建對象,這是愚蠢的。我在那裏放了一個打印語句,並且它被調用了10次,並且導致了問題,因爲我需要修改它的一些屬性,但是如果下次它被使用時它將被替換,它是徒勞的。我不知道他們爲什麼(Django開發者)這樣做。基本上,我只是希望它被構造一次,然後從那時起返回該實例。 – mpen 2011-02-10 21:44:08

回答

6

你可以分配到類,而不是實例:

MyClass.management_form = property(self.myfunc) 

當然,這改變了類本身所有實例(甚至預先存在的)。如果這是好的,你也可以只調用一次,而不是在每個派生類的構造函數中(我猜這就是你現在正在做的)。

否則,您可以將其覆蓋在派生類中常用的方式:

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