Python從入門到編寫POC系列文章是i春秋論壇作家「Exp1ore」表哥原創的一套完整教程,想系統學習Python技能的小夥伴,不要錯過哦!
1、初識OOP和類
面向對象編程——Object Oriented Programming,簡稱OOP,是一種程序設計思想。OOP把對象作為程序的基本單元,一個對象包含了數據和操作數據的函數。
面向過程的程序設計把計算機程序視為一系列的命令集合,即一組函數的順序執行。為了簡化程序設計,面向過程把函數繼續切分為子函數,即把大塊函數通過切割成小塊函數來降低系統的複雜度。
而面向對象的程序設計把計算機程序視為一組對象的集合,而每個對象都可以接收其他對象發過來的消息,并處理這些消息,計算機程序的執行就是一系列消息在各個對象之間傳遞。
在Python中,所有數據類型都可以視為對象,當然也可以自定義對象。自定義的對象數據類型就是面向對象中的類(Class)的概念。
類(Class)是面向對象程序設計(OOP,Object-Oriented Programming)實現信息封裝的基礎。類是一種用戶定義類型,也稱類類型。每個類包含數據說明和一組操作數據或傳遞消息的函數。類的實例稱為對象。
2、新式類與舊式類
先看一下二者的區别,首先是舊式類,舊式類又稱為經典類。
>>> class demo1:pass
這樣就定義了一個很簡單的舊式類,将它實例化:
>>> DEMO1 = demo1()
>>> type(demo1) <type 'classobj'> >>> DEMO1.__class__<class __main__.demo1 at 0x036FEDF8>>>> type(DEMO1)<type 'instance'>
有人可能會問DEMO1.__class__是什麼意思?
DEMO1是一個instance(實例),也是一個對象,而每個對象都有一個__class__屬性,用來顯示它的類型,到了Python2.2以後,就有了新式類。
>>> class DEMO2(object): pass>>> demo2 = DEMO2()>>> demo2.__class__<class '__main__.DEMO2'>>>> type(demo2)<class'__main__.DEMO2'>
由此,新式類與舊式類的區别:
(1)舊式類,.__class__和type( )的類型不同,但是新式類是相同的;
(2)新式類要在類的名字後面跟上(object),這是一個繼承的類的操作,也是基本操作。
3、定義類
定義新式類的方法
第一種方法:
>>> class demo(object):pass
第二種方法:
>>> __metaclass__ = type>>> class DEMO:pass
4、創建類
寫一個簡單的例子:
#coding = utf-8__metaclass__ = typeclass students: def __init__(self,name): self.name = name
聲明建立了一個名為“students”的類,用縮進表示這個類的内容,有些人也會把類裡面的函數叫做“方法”。
PS:類中的函數的參數必須包括self參數,且默認作為第一個參數,繼續深入,def __init__是一個特殊的函數,叫做構造函數(初始化函數)。
這樣就意味着實例化時要給參數name提供一個值,作為類的初始化内容,同時,要通過name參數傳一個值,成為類和實例的一個屬性。
>>> demo = students('BaZong')>>> print demo.nameBaZong
這樣就确定了這個類的基本屬性,加深理解一下:
# -*- coding: UTF-8 -*-__metaclass__ = typeclass students: def __init__(self,name): self.name = name def Name(self): return self.namestudent = students('MOMO') #将它實例化name = student.Name() #調用函數print 'This student is my goddess ------',nameprint student.name #實例的屬性
運行一下:
為何self有時必須用,有時卻不需要?
其實,self不用非得寫成self,寫成其它的也可以,這隻是約定俗稱吧。
總而言之:
(2)self的名字并不是規定死的,但是最好還是按照約定是用self;
(3)self總是指調用時的類的實例。
5、繼承
“繼承”是面向對象軟件技術當中的一個概念。如果一個類A繼承自另一個類B,就把這個A稱為"B的子類",而把B稱為"A的父類"。繼承可以使得子類具有父類的各種屬性和方法,而不需要再次編寫相同的代碼。
在令子類繼承父類的同時,可以重新定義某些屬性,并重寫某些方法,即覆蓋父類的原有屬性和方法,使其獲得與父類不同的功能。另外,為子類追加新的屬性和方法也是常見的做法。
先舉一個簡單例子:
# -*- coding: UTF-8 -*-__metaclass__ = typeclass students: def speak(self): print "Hello momo" def height(self): print "MOMO's height is 1.70m"class goddess(students): def height(self): print "MOMO's height is 1.80m"if __name__ == '__main__': demo = goddess() demo.height() demo.speak()
這就是繼承。有個小疑問,為啥是1.80m不是1.7m呢?
因為繼承了students,所以goddess這個類就有了students的所有函數(方法)和屬性,但是如果有同樣的名稱方法(函數),那麼就會顯示goddess中的方法,這叫做方法重寫。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!