跟老齊學Python之編寫類之四再論繼承

2022-09-26 17:33:14 字數 3781 閱讀 8148

複製** **如下:

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