2012-02-03 89 views

回答

2

這是一個非常寬泛的問題。由於你沒有提供的示例代碼,我將只顯示最簡單的例子:

class A(object): 
    def meth1(self, a): 
     self.meth2(a, a*a) 

class B(A): 
    def meth2(self, a, b): 
     return b/a 

b = B() 
b.meth1(10) 
+0

'a'從哪裏來?方法'meth'在哪裏? – 2012-02-03 09:18:24

+1

@Tichodroma對不起,我的錯。在寫作時應該思考;-)現在糾正。 – glglgl 2012-02-03 09:31:05

+0

如果這些類在單獨的模塊中,該怎麼辦? 即 file2.py 進口file1的 類測試用例(file1.TestBase): DEF執行(個體): self.pass() file1.py 類TestBase: DEF傳遞(自): print「PASS」 testBase = TestBase() testBase.execute() – ThePracticalOne 2012-10-19 18:03:33

9

一個子背後的一點是,它延伸變造超類的行爲。超類無法知道如何子類將其擴展。

編輯:,但它是可能的超知道,子類將擴展它。不知道,如果這是好設計,但。

0

這裏就是我剛剛試過:

class A(object): 
    def x(self): 
     print self.y() 

class B(A): 
    def y(self): 
     return 1 

>>> B().x() 
1 

所以,除非你有一些具體的問題,只需要調用從基類的子類的方法,它應該只是工作。

+1

我想知道爲什麼有人想要這樣做。我爲什麼要寫一個'A'的方式,事先已經預先知道'B'如何擴展它? – 2012-02-03 09:19:38

+1

@Tichodroma:是的,這裏有一些代碼味道。但也許它是OP的講師與現實不同步)? – 2012-02-03 09:23:10

+4

@Tichodroma也許你不知道它?讓'A'成爲一個可以用3或4種方式擴展的基類。它不知道這些是如何實現的,只知道它們提供了哪些簽名。我經常見過這樣的事情,例如在'MySQLdb'中。 – glglgl 2012-02-03 09:35:03

0

我認爲這與使用抽象方法有關。父類定義子類應該實現的方法,父類知道這些方法將被實現。類似的結構存在於例如Java中。

在Python利用這些討論以及在這裏:Abstract methods in Python

7

我相信這是經常使用的模式。

class A(object): 
    def x(self): 
     self.y() 

    def y(self): 
     print('default behavior') 


class B(A): 
    def y(self): 
     print('Child B behavior') 

class C(A): 
    def z(self): 
     pass 

>>>B().x() 
Child B behavior 
>>>C().x() 
default behavior 

它有點像抽象類,但提供了默認行爲。儘管如此,我無法記住頭頂的圖案名稱。

+0

使用C++術語,它只是多態。但是對於一切都適用的Python而言...... – matsjoyce 2014-11-21 17:54:54