python 類的子類

2021-09-19 18:32:41 字數 4419 閱讀 5691

看下面的**,請仔細閱讀,並看看是否能夠發現點什麼問題呢?

#!/usr/bin/env python

#coding:utf-8

class person:

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

self.name = name

self.lang = lang

self.email = email

def author(self):

return self.name

class programmer:

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

self.name = name

self.lang = lang

self.email = email

self.system = system

self.website = website

def pythoner(self):

pythoner_list = [ self.name, self.lang, self.email, self.system, self.website ]

return pythoner_list

if __name__=="__main__":

writer = person("hiekay","chinese","[email protected]")

python = programmer("hiekay","python","[email protected]","ubutun","hiekay.github.io")

print "my name is:%s"%writer.author()

print "i write program by:%s"%python.pythoner()[1]

上面這段**,執行起來沒有什麼問題,但是,仔細看,發現有兩個類,乙個名字叫做person,另外乙個叫做programmer,這還不是問題所在,問題所在是這兩個類的建構函式中,存在這相同的地方:self.name=name,self.lang=lang,self.email=email,這對於追求**質量的程式設計師,一般是不允許的。最好不要有重複**或者冗餘**。可是,在兩個類中都要有這些引數,應該怎麼辦呢?

看下面的**,裡面有兩個類a,b。這段程式能夠正確執行,每個類的功能是僅僅列印指定的內容。

#!/usr/bin/env python

#coding:utf-8

class a:

def __init__(self):

print "aaa"

class b:

def __init__(self):

print "bbb"

if __name__=="__main__":

a = a()

b = b()

#執行結果

aaabbb

上面的兩個類彼此之間沒有所謂的父子關係。現在稍加改變,將類b改寫,注意觀察與上面的差異。

#!/usr/bin/env python

#coding:utf-8

class a:

def __init__(self):

print "aaa"

class b(a): #這裡和上面程式不同。b繼承了a

def __init__(self):

print "bbb"

if __name__=="__main__":

a = a()

b = b()

#執行結果

aaabbb

這段程式中,類b跟前面的那段有一點不同,class b(a):,這樣寫就表明了b相對a的關係:b是a的子類,b從a繼承a的所有東西(子承父業)。

但是,執行結果一樣。是的,那是以為在b中儘管繼承了a,但是沒有呼叫任何a的東西,就好比兒子從老爸那裡繼承了財富,但是兒子乙個子也沒動,外界看到的和沒有繼承一樣。

#!/usr/bin/env python

#coding:utf-8

class a:

def __init__(self):

print "aaa"

class b(a):

def __init__(self):

#print "bbb"

a.__init__(self) #執行繼承的父類

if __name__=="__main__":

a = a()

b = b()

#執行結果

aaaaaa

這回執行結果有了變化,本來b=b()是執行類b,但是b繼承了a,並且在初始化的建構函式中,引入a的建構函式,所以,就執行a的結果相應結果了。

下面把最開頭的那端程式用子類繼承的方式重寫,可以是這樣的:

#!/usr/bin/env python

#coding:utf-8

class person:

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

self.name = name

self.lang = lang

self.email = email

def author(self):

return self.name

"""class programmer:

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

self.name = name

self.lang = lang

self.email = email

self.system = system

self.website = website

def pythoner(self):

pythoner_list = [ self.name, self.lang, self.email, self.system, self.website ]

return pythoner_list

"""class programmer(person): #繼承父類person

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

person.__init__(self,name,lang,email) #將person.__init__()的功能繼承到這裡

#self.name = name #這三句是person中已經搞定的,就不用重複

#self.lang = lang #通過繼承已經實現了這三句的功能

#self.email = email

self.system = system #子類中不同於person父類部分

self.website = website

def pythoner(self):

pythoner_list = [ self.name, self.lang, self.email, self.system, self.website ]

return pythoner_list

if __name__=="__main__":

writer = person("hiekay","chinese","[email protected]")

python = programmer("hiekay","python","[email protected]","ubutun","hiekay.github.io")

print "my name is:%s"%writer.author()

print "i write program by:%s"%python.pythoner()[1]

**執行結果與前面一樣。

需要提供注意的是,在子類中,如果要繼承父類,必須用顯明的方式將所繼承的父類方法寫出來,例如上面的person.init(self,name,lang,email),必須這樣寫,才能算是在子類中進行了繼承。如果不寫上,是沒有繼承的。用程式設計江湖的黑話(比較文雅地稱為「行話」)說就是「顯式呼叫父類方法」。

對於為什麼要用繼承:

從技術上說,oop裡,繼承最主要的用途是實現多型。對於多型而言,重要的是介面繼承性,屬性和行為是否存在繼承性,這是不一定的。事實上,大量工程實踐表明,重度的行為繼承會導致系統過度複雜和臃腫, 反而會降低靈活性。因此現在比較提倡的是基於介面的輕度繼承理念。這種模型裡因為父類(介面類)完全沒有**,因此根本談不上什麼**復用了。

在python裡,因為存在duck type,介面定義的重要性大大的降低,繼承的作用也進一步的被削弱了。

另外,從邏輯上說,繼承的目的也不是為了復用**,而是為了理順關係。

python 子類與父類

coding utf 8 建立乙個空類 class person pass someone person 加入初始化方法 class person def init self 第乙個引數必須為self pass 為初始化方法新增額外引數 class person def init self,name...

Python子類和父類

寫過程式的都知道類,就是物件導向的意思,程式設計的水平大致分為幾個層次,基本語法,函式,物件導向,資料結構,架構,越往上水平越高。在建立類的時候,我們通常把具有相關性的函式包裝為乙個類,類也可以巢狀,叫父類和子類,尤其在python中,所有的物件都可以當成乙個variable,下面給出乙個類巢狀的例...

python子類呼叫父類的方法

情況一 子類需要自動呼叫父類的方法 子類不重寫 init 方法,例項化子類後,會自動呼叫父類的 init 的方法。class father object def init self,name self.name name print name s self.name def getname self...