版權聲明:本文為作者原創(chuàng)文章薄翅,可以隨意轉載沙兰,但必須在明確位置標明出處Cツ巍!鼎天!
文章講到這里舀奶,我不得不想先把面向對象的編程講了,否則我們的代碼看上去將會越來越亂斋射,越來也不易管理育勺。
什么是類
類是對現(xiàn)實生活中一類具有共同特征的事物的抽象。所有的事物都來源于生活罗岖,不管哪行哪業(yè)都是為了解決我們生活中的問題涧至,編程亦是。
類的三大屬性
- 封裝:類將具有共同特征的一類事物抽象在一起桑包,比如水果類包含蘋果南蓬、香蕉、梨子哑了、西瓜等等赘方,這些具有同樣屬性的我們可以歸為到一個類里
- 繼承:類是有繼承關系的,繼承關系的作用是讓子類具有自己特有的行為弱左,不如西瓜是它是繼承水果的窄陡,那么西瓜它可以定義自己特有的行為、屬性科贬,像有籽西瓜泳梆、無籽西瓜兩種屬性,子類可以繼承父類的公有方法和屬性榜掌。什么意思呢优妙,就像你可以繼承你爸媽的財產(chǎn),但是你不能繼承你爸媽的朋友憎账,或隱私方面的東西套硼,隱私方面的東西在編程語言中我們稱之為private(私有的),私有的東西子女是不可以繼承的胞皱。還有一點就是繼承可以是多層級結構的邪意,就像你可以繼承你爸媽的財產(chǎn),你兒子也能繼承你的財產(chǎn)反砌,那么你兒子的財產(chǎn)就包含了你的和爸媽的財產(chǎn)雾鬼。
- 多態(tài):從字面意思理解就是多鐘形態(tài),專業(yè)的解釋就是:多態(tài)性是允許你將父對象設置成為一個或更多的他的子對象相等的技術宴树,賦值之后策菜,父對象就可以根據(jù)當前賦值給它的子對象的特性以不同的方式運作。專業(yè)解釋我想信大多初學者都不明白啥意思。舉個例子:某公司A和幾個快遞服務公司有合作關系又憨,比如順風翠霍、中通、申通蠢莺。順風快遞給A公司打電話說你們公司今年的快件服務我包了寒匙,那么從簽訂合同日起,A公司的所有快遞服務都會自動的通過順風快遞走躏将,同理锄弱,明年若是中通簽了合同,那么A公司明年的快遞服務都自動的走中通快遞服務祸憋。我相信講到這里大家應該能明白多態(tài)是什么意思了棵癣,多態(tài)說百了就是種接口服務。就像公司A它提供了一個快遞服務接口夺衍,那么只要是快遞公司都可以去調(diào)用這個接口狈谊。調(diào)用接口后就按照自己公司的物流走就是了。
類的定義
class myclass(object):
class_suite
類的定義主要是使用關鍵字「class」沟沙,類定義好了以后可以在類里定義方法河劝,變量;專業(yè)術語稱之為行為矛紫,屬性赎瞎。
類的繼承
class A(object):
def foo(self):
print('this is A')
class B(A):
pass
class C(B):
pass
if __name__ == '__main__':
cc = C()
cc.foo()
類C繼承類B,類B繼承類A颊咬,pass關鍵字的意思是什么也不做务甥,在類中定義方法第一個參數(shù)都是self,表示類本身喳篇,如果你接觸過C/C++語言敞临,那么這里的self就跟C/C++語言里的this指針一個意思。
- 「if _name_ == '_main_'」:這一句是入口函數(shù)麸澜,當我們運行該程序時解釋器從這里開始執(zhí)行挺尿。
- 「cc = C()」:創(chuàng)建一個C類型的實例,只有創(chuàng)建了實例才能去調(diào)用類中的方法和屬性炊邦,
- 「cc.foo()」: 這一句就充分體現(xiàn)了類的繼承關系编矾, 類C沒有定義foo()方法,當時它繼承了B馁害,B又繼承了A窄俏,所以C自然也就繼承了A的foo方法,這就是繼承的好處碘菜,如果父類提供了你需要的方法凹蜈,你就不需要再去重復定義實現(xiàn)了怒详。
繼承中的覆蓋(Overriding)
繼承中的覆蓋是什么意思呢,如果類B也要實現(xiàn)方法foo踪区,當時它的方法和類A的行為是不是一樣的,那我們就稱這種行為為覆蓋
class A(object):
def foo(self):
print('this is A')
class B(A):
def foo(self):
print('this is B')
class C(B):
def foo(self):
print('this is C')
if __name__ == '__main__':
cc = C()
cc.foo()
結果將會輸出‘this is C’吊骤,類C中的foo方法就是C類特有的行為缎岗。那么到這里有認真思考過的同學就要問,我又想有自己的行為白粉,也想調(diào)用父類的行為怎么辦呢传泊,看下面的代碼
class A(object):
def foo(self):
print('this is A')
class B(A):
def foo(self):
A.foo(self)
print('this is B')
class C(B):
def foo(self):
B.foo(self)
print('this is C')
if __name__ == '__main__':
cc = C()
cc.foo()
執(zhí)行的結果將會輸出
this is A
this is B
this is C
super的使用
上面例子的寫法雖然可以達到目的,但不是一種好的寫法鸭巴,它的不好之處在于若在你的工程中有大量的此種寫法眷细,那么若是類的繼承關系變了,那你不得不在整個工程中去查找修改相應的代碼鹃祖,這里我們使用super的方式改寫它溪椎。
class A(object):
def foo(self):
print('this is A')
class B(A):
def foo(self):
super(B, self).foo()
print('this is B')
class C(B):
def foo(self):
super(C, self).foo()
print('this is C')
if __name__ == '__main__':
cc = C()
cc.foo()
輸出的結果和上面一致,使用super()的漂亮之處在于恬口,你不需要明確給出任何基類名字...“跑腿事兒”校读,它幫你干了!使用super()的重點祖能,是你不需要明確提供父類歉秫。這意味著如果你改變了類繼承關系,你只需要改一行代碼(class 語句本身)而不必在大量代碼中去查找所有被修改的那個類的名字养铸。
構造器init()
構造器也叫構造函數(shù)雁芙,當一個類實例化的時候它將會自動調(diào)用該函數(shù),這里我們需要提點的是钞螟,在python中類B繼承了類A兔甘,他們都實現(xiàn)了_init_()函數(shù),那么當類B實例化的時候不會去調(diào)用類A的構造方法了鳞滨,這個和C/C++裂明,JAVA語言是不同的,大家要注意這點
class A(object):
def __init__(self):
print('this is A init')
def foo(self):
print('this is A')
class B(A):
def __init__(self):
print('this is B init')
def foo(self):
super(B, self).foo()
print('this is B')
class C(B):
def __init__(self):
print('this is C init')
def foo(self):
super(C, self).foo()
print('this is C')
if __name__ == '__main__':
cc = C()
cc.foo()
執(zhí)行結果將會輸出
this is C init
this is A
this is B
this is C
可以看到它并沒有去調(diào)用A,B類的構造器init()方法太援,如果C不定義會輸出什么大家可以自己去試試
私有屬性闽晦,私有方法
在python中,類中的所有方法和屬性默認是‘public’共有的提岔,可以被繼承的仙蛉,那么如果想要屬性和方法不能被繼承怎么辦呢,那就是在屬性和方法的定義前加兩個下劃線碱蒙, 特別需要提點的是我們自己內(nèi)中定義的函數(shù)不要有想_xxx_()這種定義荠瘪,這種定義是python內(nèi)建函數(shù)的定義夯巷,切記、切記哀墓。
class A(object):
def __foo(self):
print('this is A')
class B(A):
pass
class C(B):
pass
if __name__ == '__main__':
print(dir(C))
cc = C()
cc.__foo()
執(zhí)行結果將會出現(xiàn)下面錯誤
Traceback (most recent call last):
File "classtest.py", line 16, in <module>
cc.__foo()
AttributeError: 'C' object has no attribute '__foo'
多態(tài)的實現(xiàn)
下面我們將實現(xiàn)一個多態(tài)的例子來結束本章的內(nèi)容趁餐,例子的來源還是用上面提供的快遞服務
class Company(object):
#提供一個快遞服務接口
def express_service(self, express_company):
express_company.send()
#順風快遞公司
class FS(Company):
def send(self):
print('welcome to express by FS')
#中通跨地公司
class ZT(Company):
def send(self):
print('welcome to express by ZT')
#申通跨地公司
class ST(Company):
def send(self):
print('welcome to express by ST')
if __name__ == '__main__':
service = Company()
#使用FS快遞服務
fs = FS()
service.express_service(fs)
#使用ZT快遞服務
zt = ZT()
service.express_service(zt)
#使用ST快遞服務
st = ST()
service.express_service(st)
各位若是初學者一定要敲代碼,去執(zhí)行篮绰,去體會一下類的三大屬性
note: 初學者最容易犯的錯就是書面上看著挺簡單的啊后雷,把書一關上就懵了,想要成為一個程序員吠各,一定要多去敲代碼臀突,切記,切記