2011-02-10 14 views
5

Klasa bazowa ma to:Python: Jak zamienić właściwość na zwykły atrybut?

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

W mojej klasie pochodnej, próbuję napisać to:

self.management_form = self.myfunc() 

Ale oczywiście to nie działa. Mówi mi "nie mogę ustawić atrybutu", ponieważ ta właściwość nie ma żadnego narzędzia ustawiającego. Ale nie chcę tego ustawić, chcę na nowo zdefiniować, co oznacza "managent_form". Próbowałem najpierw wstawić del self.managent_form, ale to też nie działało. Więc w jaki sposób mogę ją unieważnić?

+0

jesteś pewien, że to dobry pomysł? To brzmi jak zerwanie relacji is-a ... – delnan

+0

Sposób zdefiniowania właściwości, rekonstruuje obiekt za każdym razem, gdy go używasz, co jest po prostu głupie. Umieściłem tam oświadczenie, które jest wywoływane, jak 10 razy, i powoduje problemy, ponieważ muszę zmodyfikować niektóre jego właściwości, ale jest to bezużyteczne, jeśli zostanie zastąpione następnym razem. Nie mam pojęcia, dlaczego oni (twórcy Django) zrobili to w ten sposób. Zasadniczo po prostu chcę, aby został skonstruowany jeden raz, a następnie od tego momentu zwróci tę instancję. – mpen

Odpowiedz

6

Można przypisać do klasy, zamiast instancji:

MyClass.management_form = property(self.myfunc) 

Oczywiście, to zmienia klasę samą dla wszystkich instancji (nawet Preegzystujące jedynek). Jeśli jest to w porządku, możesz również wywołać je dokładnie raz, a nie w każdym konstruktorze klasy pochodnej (co domyślam się, co teraz robisz).

W przeciwnym razie, można zastąpić go w klasie pochodnej w zwykły sposób:

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

Myślę, że nadpisanie go po prostu powrót nieruchomości jest wystarczająco dobre ... dziwne, że można go jednak usunąć. Cała reszta w Pythonie jest całkowicie zmienna. – mpen

Powiązane problemy