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 派生類名 繼承方式 基類名 派生類新增加的...