複製** **如下:
#!/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 www.cppcns.com"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
為了能夠突出繼承問題的**,還是用那種簡單的類來做實驗。
多餘的b
複製** **如下:
#!/usr/bin/env python
#coding:utf-8
class a:
def __init__(self):
print "aaa"
class b
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(acvqelzrp):
def method2(self):
print('c.method2')
def method3(self):
&nwww.cppcns.combsp; print('c.method3')
class d(b, c):
def method4(self):
print('c.method4')
d = d()
d.method4() # 在 d 找到,c.m程式設計客棧ethod4
d.method3() # 以 d->b 順序找到,b.method3
d.method2() # 以 d->b->c 順序找到,c.method2
d.method1() # 以 d->b->c->a 順序找到,a.method1
務必請真正的學習者要對照每個類的每個方法,依次找到相應的輸出結果。從而理解繼承的順序。學習,就要點滴積累。
本文標題: 跟老齊學python之編寫類之四再論繼承
本文位址:
跟老齊學Python之Python安裝
任何高階語言都是需要乙個自己的程式設計環境的,這就好比寫字一樣,需要有紙和筆,在計算機上寫東西,也需要有文字處理軟體,比如各種名稱的office。筆和紙以及office軟體,就是寫東西的硬體或軟體,總之,那些文字只能寫在那個上邊,才能最後成為一篇文章。那麼程式設計也是,要有個什麼程式之類的東西,要把...
跟老齊學Python之重回函式
函式的基本結構 python中的函式基本結構 複製 如下 def 函式名 引數列表 語句幾點說明 函式名的命名規則要符合python中的命名要求。一般用小寫字母和單下劃線 數字等組合 def是函式的開始,這個簡寫來自英文單詞define,顯然,就是要定義乙個什麼東西 函式名後面是圓括號,括號裡面,可...
跟老齊學Python之集合的關係
凍結的集合 前面一節講述了集合的基本概念,注意,那裡所涉及到的集合都是可原處修改的集合。還有一種集合,不能在原處修改。這種集合的建立方法是 f set frozenset qiwsir 看這個名字就知道了frozen,凍結的set f set frozenset q i s r w f set.ad...