#!/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...