2012-02-19 54 views
22

假設我有兩個類(一個父類和一個子類)。如果在子類中定義的方法不同,我如何引用父類中的方法?如何在python中引用父級方法?

下面是代碼:

class A: 
    def __init__(self, num): 
     self.value=num 
    def f(self, num): 
     return self.value+2 
class B(A): 
    def f(self, num): 
     return 7*self.f(num) 

在最後一行,我想引用父類A用「self.f(NUM)」命令,而不是方法本身中B,其會創建一個無限遞歸。先謝謝你。

回答

28

如果你知道你要使用你也可以明確地指這樣:

class B(A): 
    def f(self,num): 
     return 7 * A.f(self,num) 

請記住,您必須明確地將自變量賦予成員函數A.f()

+0

當我嘗試調用一個在C中實現的方法時,我遇到了一個錯誤。它期望A的一個實例作爲第一個參數,並且不會將B識別爲子類。我想使用super()可能會解決這個問題,但我還不確定。 – erikbwork 2013-06-25 09:16:50

35

使用super

return 7 * super(B, self).f(num) 

或者在Python 3,這只是:

return 7 * super().f(num) 
+0

這在理論上是正確的,但出於某種原因,我得到:TypeError:super()參數1必須是type,而不是classobj – user1111042 2012-02-19 07:14:48

+6

@ user1111042:讓我猜 - 您使用的是Python 2.x?然後你的_class A應該從_object_繼承,只有這樣你才能得到一個新的樣式類。新樣式類是類_type_的實例,而舊樣式類只是_classobj_的實例。 _super()_僅適用於新樣式類。 – pillmuncher 2012-02-19 07:23:06

+0

是的,我使用Python 2.x和超級,因爲你說在2.x – user1111042 2012-02-19 07:29:20

1
class B(A): 
    def f(self, num): 
     return 7 * super(B, self).f(num) 
1

爲什麼不簡單?

class B(A): 
    def f(self, num): 
     return 7 * A.f(self, num) 
0

你可以使用超級或如果你可以更明確地做這樣的事情。

class B(A): 
    def f(self, num): 
    return 7 * A.f(self, num) 
5

在與其他的答案線,有多種方式來調用超類方法(包括構造),但是在Python-3.X的進程已被簡化了:

的Python -2- .X

class A(object): 
def __init__(self): 
    print "world" 

class B(A): 
def __init__(self): 
    print "hello" 
    super(B, self).__init__() 

Python的3.x的

class A(object): 
def __init__(self): 
    print "world" 

class B(A): 
def __init__(self): 
    print "hello" 
    super().__init__() 

super()現在等於super(<containing classname>, self)根據the docs

相關問題