python 類的子類
看下面的程式碼,請仔細閱讀,並看看是否能夠發現點什麼問題呢?
#!/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","hiekay@gmail.com")
python = Programmer("hiekay","Python","hiekay@gmail.com","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()
#執行結果
aaa
bbb
上面的兩個類彼此之間沒有所謂的父子關係。現在稍加改變,將類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()
#執行結果
aaa
bbb
這段程式中,類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()
#執行結果
aaa
aaa
這回執行結果有了變化,本來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","hiekay@gmail.com")
python = Programmer("hiekay","Python","hiekay@gmail.com","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類的子類Python
- 如何理解Python3中的子類和父類?Python
- 類的繼承_子類繼承父類繼承
- Python 類變動的鉤子方法Python
- Java超類與子類Java
- tcbs之集合類與子類的示例
- C# 繼承 子類(派生類) 父類(基類)C#繼承
- 集合框架-List的子類框架
- iOS子類化iOS
- Java學習關於時間操作的應用類--Date類、Calendar類及其子類Java
- python的類Python
- 鏈式-父類中返回子類物件物件
- 父類和子類的建構函式問題函式
- 父類和子類之間的轉換問題
- 子類重寫父類的方法@Override的快捷鍵IDE
- Set集合的直接子類TreeSet
- c# abstract抽象類與繼承類子類的建構函式_baseC#抽象繼承函式
- 實現不可變類如何禁止子類化?
- java中父類宣告子類例項化Java
- 原型繼承:子類原型繼承
- .NET CORE AUTOMAPPER 對映一個類的子類APP
- java中多型的理解——父類引用指向子類物件Java多型物件
- 子類繼承父類的建構函式(方法)嗎?繼承函式
- python建立類和類方法Python
- 京東獲得jd商品分類API介面(父分類、根分類、子分類)API
- Python的元類Python
- python類的使用Python
- Python的類方法Python
- Python程式設計:Counter計數器-dict字典的子類Python程式設計
- Python 繼承和子類示例:從 Person 到 Student 的演示Python繼承
- python 類Python
- Python類Python
- Java子類和父類的初始化執行順序Java
- C++父類指標指向子類物件的實現原理C++指標物件
- C#介面、抽象類、普通類和繼承(子類與父類)都有其特定的用途和場景C#抽象繼承
- Set集合的具體子類:HashSet
- 子類繼承父類(父類和子類裡:塊、靜態塊、構造和方法覆寫)之間呼叫順序繼承
- Python元類與列舉類Python