2015-03-03 14 views
6

Hãy nói rằng chúng tôi có các loại sau đây:Mở rộng hành vi của một chức năng di truyền bằng Python

class Base(object): 

    def load(self): 
     # do logic A 

     # do logic B 

class Child(Base): 

    def load(self): 
     # do logic C 

Tôi biết trang trí có thể được sử dụng để mở rộng hành vi chức năng trong Python nhưng tôi không biết làm thế nào tôi có thể áp dụng nó trong trường hợp của tôi. Khi Child'sload() được gọi là, làm thế nào tôi có thể nhận được các hành mã sau đây theo thứ tự này ?:

logic A 

logic C 

logic B 

Tôi không muốn làm

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() 

Tôi chỉ muốn mã lên logic C, mà không cần phải gọi logic A và B

+2

Chia Logic A và B trong đến hai chức năng khác nhau? – thefourtheye

Trả lời

3

Ý của bạn là như sau:

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() 

này sẽ in:

do logic A 
do logic B 
do logic C 

Chỉ khác cách tôi có thể nghĩ đến là một trong những điều này:

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() 

in này:

do logic A 
do logic C 
do logic B 
+0

Đóng, nhưng tôi đang hướng đến logic C được gọi trước B – starhacker

+0

Nhưng vấn đề là, tôi không muốn gọi một cách rõ ràng logic A hoặc B ... logic C về cơ bản chỉ là phần mở rộng của tải Cơ sở() – starhacker

+1

@ Unit978 Bạn đang nói bạn muốn hàm con thực hiện ở giữa hàm lớp cơ sở? –

Các vấn đề liên quan