2015-03-03 12 views
6

Powiedzmy mamy następujących klas:Rozszerzanie zachowanie odziedziczonej funkcji w Pythonie

class Base(object): 

    def load(self): 
     # do logic A 

     # do logic B 

class Child(Base): 

    def load(self): 
     # do logic C 

wiem dekoratorzy mogą być wykorzystane do rozszerzenia zachowanie funkcji w Pythonie, ale nie wiem, jak mogę go zastosować w moim przypadku. Kiedy Child'sload() nazywa się, jak mogę uzyskać następujące egzekucje kodu w tej kolejności ?:

logic A 

logic C 

logic B 

Co Nie chcą zrobić

class Base(object) 

    def logicA() 
     pass 

    def logicB() 
     pass 

    def load() 
     pass 

class Child(Base): 

    def load(self): 
     super.logicA() 

     # do logic C 

     super.logicB() 

Chcę tylko zakodowanie logika C, bez konieczności jawnego wywoływania logiki A i B

+2

logika Podział A i B do dwóch różnych funkcji? – thefourtheye

Odpowiedz

3

Masz na myśli coś takiego:

class Base(object): 

    def load(self): 
     print('do logic A') 
     print('do logic B') 


class Child(Base): 

    def load(self): 
     super().load() 
     print('do logic C') 


c = Child() 
c.load() 

ten wypisze:

do logic A 
do logic B 
do logic C 

Jedynym sposobem można myślę, jest to jedno:

class Base(object): 

    def load(self): 
     print('do logic A') 
     self.new_logic() # call new logic from child class, if exist. 
     print('do logic B') 

    def new_logic(self): 
     # overwrite this one in child class 
     pass 


class Child(Base): 

    def new_logic(self): 
     print('do logic C') 


c = Child() 
c.load() 

Drukuje:

do logic A 
do logic C 
do logic B 
+0

Zamknij, ale zamierzam wywołać logikę C przed B – starhacker

+0

Ale chodzi o to, że nie chcę jawnie wywoływać logiki A lub B ... logika C jest w zasadzie tylko rozszerzeniem obciążenia podstawowego() – starhacker

+1

@ Unit978 Chcesz, aby funkcja potomna była wykonywana w środku funkcji klas bazowych? –