在Python多繼承中呼叫父類的同名方法

2021-07-05 03:57:19 字數 2892 閱讀 9229

# -*- coding:utf-8 -*-

#類定義

class

people

(object):

#定義基本屬性

name = ''

age = 0

#定義私有屬性

__weight = 0

#定義構造方法

def__init__

(self,n,a,w):

self.name = n

self.age = a

self.__weight = w

#定義方法

defspeak

(self):

print("%s is speaking:i am %d years old, %d weight."%(self.name,self.age,self.__weight))

# 例項化

p = people("tom",17,100)

p.speak()

print

'*'*40

#單繼承示例

class

student

(people):

grade = ''

def__init__

(self,n1,a1,w1,g1):

people.__init__(self,n1,a1,w1)

self.grade = g1

defspeak

(self):

print("%s is speaking: i am %d years old,and i am in grade %d"%(self.name,self.age,self.grade))

s = student('ken',20,60,3)

s.speak()

#另乙個類,多重繼承之前的準備

class

speaker

():#需改為 class speaker(object):

topic = ''

name = ''

def__init__

(self,n,t):

self.name = n

self.topic = t

# def speak(self):

# print("i am %s,i am a speaker!my topic is %s"%(self.name,self.topic))

#多重繼承

class

sample

(speaker,student):

a =''

def__init__

(self,n,a,w,g,t):

student.__init__(self,n,a,w,g)

speaker.__init__(self,n,t)

test = sample("tim",25,80,9,"python")

test.speak()```#方法名同,預設呼叫的是在括號中排前地父類的方法```

若想要讓`test.speak()`呼叫的是student父類中的speak( )方法,則想要指定。方法有兩種:

方法一:

最簡單的方法是把物件呼叫轉換成類呼叫,需要注意的是這時self引數需要顯式傳遞,將sample的類改寫為:

class

sample

(speaker,student):

a =''

def__init__

(self,n,a,w,g,t):

student.__init__(self,n,a,w,g)

speaker.__init__(self,n,t)

defspeak

(self):

student.speak(self) #self是必須的

test = sample("tim",25,80,9,"python")

test.speak()

#此時該speak的方法是呼叫student類裡的speak方法,而不是speaker類裡的方法。

缺點:

比如說如果修改了父類名稱,那麼在子類中會涉及多處修改,另外,python是允許多繼承的語言,如上所示的方法在多繼承時就需要重複寫多次,顯得累贅。為了解決這些問題,python引入了super()機制

方法二:

使用super()機制,**如下:

class

sample

(speaker,student):

a =''

def__init__

(self,n,a,w,g,t):

student.__init__(self,n,a,w,g)

speaker.__init__(self,n,t)

defspeak

(self):

super(sample,self).speak() # super()機制

test = sample("tim",25,80,9,"python")

test.speak()

在使用super()的過程中出現過

「typeerror: must be type, not classobj」錯誤

關於typeerror,在定義兩個父類的時候加入他們的父類(object),如下,再嘗試一次,因為python 2中的classobj不算做一種type,如果你用python 3的話應該就沒有這種問題了。

python繼承父類的呼叫

python中的乙個派生類整合多個基類時候。例項化派生類物件後呼叫方法。如下 class baserequest pass class requesthandler baserequest def process request self print requesthandler.process r...

Python高階 在子類中呼叫父類方法

class vehicle 定義交通工具類 country china def init self,name,speed,load,power self.name name self.speed speed self.load load self.power power defrun self pr...

頁面繼承父類,在父類中判斷使用者登入

現在一般的 都會設計到判斷使用者登入的問題,這其中有很多中解決方案。用物件導向的繼承思想來實現是一種較好的解決方案。很簡單,就是再父類 pagelogin.cs 中進行登入判斷,每個頁面都要繼承這個父類,父類中通過重寫oninit來實現再頁面page load之前進行登入驗證。pagelogin.c...