零基礎學python 編寫類之四再論繼承

2021-06-28 00:40:15 字數 3744 閱讀 1948

#!/usr/bin/env python

#coding:utf-8

class person:

def __init__(self, name, email):

self.name = name

self.email = email

class programmer(person):

def __init__(self, name,email,lang, system, website):

person.__init__(self,name,email)

self.lang = lang

self.system = system

self.website = website

class pythoner(programmer):

def __init__(self,name,email):

programmer.__init__(self,name,email,"python","ubuntu","qiwsir.github.io")

if __name__=="__main__":

writer = pythoner("qiwsir","[email protected]")

print "name=",writer.name

print "lang=",writer.lang

print "email=",writer.email

print "system=",writer.system

print "website=",writer.website

#執行結果

name= qiwsir

lang= python

email= [email protected]

system= ubuntu

website= qiwsir.github.io

對結果很滿意,再看程式中的繼承關係:pythoner <-- programmer <-- person,從上面的過程中不難看出,繼承能夠減少**重複,是的**更簡練。另外,在繼承的時候,也可以在函式中對引數進行預設賦值。

為了能夠突出繼承問題的**,還是用那種簡單的類來做實驗。

#!/usr/bin/env python

#coding:utf-8

class a:

def __init__(self):

print "aaa"

class b(a):

pass

if __name__=="__main__":

a = a()

b = b()

#執行結果

aaaaaa

b繼承a,沒有任何修改地繼承,b就可以不用寫任何東西了,或者說b本質上就是乙個多餘。在真實的程式設計過程中,沒有這樣寫的,這裡僅僅是為了向看官展示一下繼承的含義罷了。

##首個繼承有效

#!/usr/bin/env python

#coding:utf-8

class a:

def __init__(self):

print "aaa"

class b:

def __init__(self):

print "bbb"

class c1(a,b):

pass

class c2(b,a):

pass

if __name__=="__main__":

print "a--->",

a = a()

print "b--->",

b = b()

print "c1(a,b)--->",

c1 = c1()

print "c2(b,a)--->",

c2 = c2()

#執行結果

a---> aaa

b---> bbb

c1(a,b)---> aaa

c2(b,a)---> bbb

列位看官是否注意了,類c1繼承了兩個類a,b;類c2也繼承了兩個類,只不過書寫順序有點區別(b,a)。從執行結果可以看出,當子類繼承多個父類的時候,對於建構函式__init__(),只有第乙個能夠被繼承,第二個就等掉了。所以,一般情況下,不會在程式中做關於建構函式的同時多個繼承,不過可以接力繼承,就如同前面那個比較真實的**一樣。

#!/usr/bin/env python

#coding:utf-8

class a:

def __init__(self):

print "aaa"

def amethod(self):

print "method a"

class b(a):

def __init__(self):

print "bbb"

if __name__=="__main__":

print "a--->"

a = a()

a.amethod()

print "b--->"

b = b()

b.amethod()

#執行結果

a--->

aaamethod a

b--->

bbbmethod a

為了說明白上面的情況,還是畫了一張圖,不過,我畫完之後,就後悔了,看這張圖好像更糊塗了。怎麼著也畫了,還是貼出來,如果能夠協助理解更好了。

a的例項和呼叫,就不多說了。重點看b,類b繼承了a,同時,b在建構函式中自己做了規定,也就是b的建構函式是按照b的意願執行,不執行a的內容,但是,a還有乙個amethod(self)方法,b則繼承了這個方法。當通過類b的例項呼叫這個方法的時候,就能夠成功了:b.amethod()

這就是方法的繼承和呼叫方法。

所謂繼承,就是從下到上一級一級地找相應的繼承物件,找到了就繼承之。如果有同名的怎麼辦?按照什麼順序找呢?

應用網上的一段:

在python中,可以進行多重繼承,這個時候要注意搜尋的順序,是從子類別開始,接著是同一階層父類別由左至右搜尋,再至更上層同一階層父類別由左至右搜尋,直到達到頂層為止。

**舉例:

class a(object):

def method1(self):

print('a.method1')

def method2(self):

print('a.method2')

class b(a):

def method3(self):

print('b.method3')

class c(a):

def method2(self):

print('c.method2')

def method3(self):

print('c.method3')

class d(b, c):

def method4(self):

print('c.method4')

d = d()

d.method4() # 在 d 找到,c.method4

d.method3() # 以 d->b 順序找到,b.method3

d.method2() # 以 d->b->c 順序找到,c.method2

d.method1() # 以 d->b->c->a 順序找到,a.method1

務必請真正的學習者要對照每個類的每個方法,依次找到相應的輸出結果。從而理解繼承的順序。學習,就要點滴積累。

零基礎學Python

零基礎學python 1 1 python是一門指令碼語言 2 python的優勢 1 語法和結構比較簡單,易入門 2 能夠跨平台使用 3 應用範圍廣,設計到作業系統 3d動畫 web 雲計算,企業應用等多方面。3 idle 是乙個python shell,類似於windows的cmd視窗 4 pr...

零基礎學python 類的細節

前面對類的有關內容已經描述不少了,其實話題遠遠沒有結束,不過對於初學者,掌握這些已經算是入門,在以後的實踐中,還需要進行體會和感悟。大家對oop有不同看法,所謂工程派和學院派看法不一致。從應用的角度看,工程派的觀點是值得推薦的,那就是 不用太在意內部是怎麼工作的,只要能夠解決眼下的問題即可。但是,對...

零基礎學python 編寫類之二方法

上一講中建立了類,並且重點講述了建構函式以及類例項,特別是對那個self,描述了不少。在講述建構函式的時候特別提到,init 是乙個函式,只不過在類中有一點特殊的作用罷了,每個類,首先要執行它,它規定了類的基本結構。usr bin env python coding utf 8 class pers...