004 繼承與派生

2022-03-23 22:52:33 字數 4081 閱讀 7634

class p1:                 # 定義父類p1

pass

class p2: # 定義父類p2

pass

class p_chirdren1(p1): # 單繼承:基類是p1,派生類是p_chirdren1

pass

class p_chirdren2(p1, p2):# 多繼承:基類是p1、p2, 派生類是p_chirdren2

pass

# __base__只檢視從左到右繼承的第乙個父類

# __bases__則是檢視子類繼承的所有父類

print(p_chirdren1.__base__) # class '__main__.p1'

print(p_chirdren2.__base__) # class '__main__.p1'

print(p_chirdren2.__bases__) # (class '__main__.p1', class '__main__.p2')

在python3當中

抽象就是把多個類相似的特徵和行為抽取出來,抽取到父類,然後繼承它。

子類繼承了父類的屬性和方法,當然也可以新增自己新的屬性和方法或者重寫,不會影響到父類。但是呼叫的時候就會以自己的為準,不會呼叫父類的。

class hero:

"""英雄類

"""def __init__(self, nickname, life_value, aggresivity):

self.nickname = nickname

self.life_value = life_value

self.aggresivity = aggresivity

def acctack(self, enemy):

enemy.life_value -= self.aggresivity

if enemy.life_value < 0:

print('%s 取得勝利,殺死了%s' % (self.nickname, enemy.nickname))

class garen(hero):

"""蓋倫類

"""# 宣告乙個新屬性

camp = 'demacia'

def acctack(self):

"""重寫父類當中的acctack()。

:return:

"""print('from garen')

class riven(hero):

"""瑞文類

"""camp = 'noxus'

g1 = garen('葛小倫', 21, 30)

print(g1.camp) # demacia

g1.acctack() # from garen

對於定義的每乙個類。python會計算出乙個方法解析順序列表(mro),它代表了類繼承的順序,也代表了子類的屬性和方法的查詢順序。

class a:

def test(self):

print('a')

class b(a):

def test(self):

print('b')

class c(a):

def test(self):

print('c')

class d(b):

def test(self):

print('d')

class e(c):

def test(self):

print('e')

class f(d, e):

def test(self):

# print('d')

pass

# 新式類 d-->b-->e-->c-->a

print(f.mro()) # (class '__main__.f', class '__main__.d', class '__main__.b', class '__main__.e', class '__main__.c', class '__main__.a', class 'object')

print(f.__mro__) # [class '__main__.f', class '__main__.d', class '__main__.b', class '__main__.e', class '__main__.c', class '__main__.a', class 'object']

class vehicle(object):

"""交通工具類

"""country = 'china'

def __init__(self, name, speed, load, power):

self.name = name

self.speed = speed

self.load = load

self.power = power

def run(self):

print('開動了')

class subway(vehicle):

"""地鐵類

"""def __init__(self, name, speed, load, power, line):

# 呼叫父類的初始化方法

vehicle.__init__(self, name, speed, load, power)

self.line = line

def run(self):

print('地鐵%s歡迎你' % self.line)

vehicle.run(self)

s = subway('北京','180km/h','100人/節','電','1號線')

s.run()

class vehicle(object):

"""交通工具類

"""country = 'china'

def __init__(self, name, speed, load, power):

self.name = name

self.speed = speed

self.load = load

self.power = power

def run(self):

print('開動了')

class subway(vehicle):

"""地鐵類

"""def __init__(self, name, speed, load, power, line):

# 相當於例項本身,在python中:super() == super(subway,self)

# super(subway, self).__init__(name,speed,load,power)

super().__init__(name,speed,load,power)

self.line = line

def run(self):

print('地鐵%s歡迎你' % self.line)

# super(subway, self).run()

super().run()

s = subway('北京','180km/h','100人/節','電','1號線')

s.run()

# 誤區

class a:

def f1(self):

print('a')

super().f1()

class b:

def f1(self):

print('b')

class c(a, b):

pass

c = c()

c.f1() # a b super會讓人覺得他繼承了b,就去b類尋找f1方法。 實際上,super依賴繼承,根據c的mro列表一步步找。

print(c.__mro__) # (class '__main__.c', class '__main__.a', class '__main__.b', class 'object')

派生與繼承 多重派生

1 理解下面的程式,並在 vc 6.0 下執行檢視結果,回答程式後面的問題。class cbase1 cbase1 void print protected int a class cbase2 cbase2 void print protected int b class cderive publ...

繼承與派生

實驗內容 建立乙個基類,兩個派生類,讓每乙個派生類都包含乙個函式area 分別用來返回矩形和三角形的面積。用建構函式對height和width進行初始化。要求通過基類指標訪問虛函式的方法。純虛函式 virtual double area 0 純虛函式的作用是在基類中為派生類保留乙個函式的名字,以便派...

繼承與派生

在c 中,所謂 繼承 就是在乙個已存在的類的基礎上建立乙個新的類。已存在的類成為 基類 新建立的類成為 派生類 乙個新類從已有的類那裡獲得其已有特性,這種現象成為累的繼承。從另一角度說,從已有的類產生乙個新的子類,稱謂累的派生。派生類的宣告方式 class 派生類名 繼承方式 基類名 派生類新增加的...