壹、如何定義壹個類
在python面向對象編程之前,我們先了解幾個術語:類、類對象、實例對象、屬性、函數、方法。
1.什麽是面向對象?
面向對象(oop)是理解世界的壹種抽象方式。世界上的壹切都可以抽象成壹個對象,壹切都是由對象組成的。程序設計中的應用是壹種開發程序的方法,它把對象作為程序的基本單位。
2.面向對象和面向過程的區別
我們已經引入了面向過程。面向過程的核心是‘過程’二字,過程就是解決問題的步驟。面向過程的方法就像設計流水線壹樣,是壹種機械的思維方式。
優點:復雜的問題簡單化,流線型。
缺點:擴展性差
主要應用場景有:Linux內核、git、http服務。
面向對象編程的核心是對象,是特征(變量)和技能(函數)的結合。
優點:解決了程序擴展性差的問題。
缺點:可控性差,無法預測最終結果
主要應用場景是需求不斷變化的軟件,即與用戶交互頻繁的軟件。
需要註意的是,面向對象編程並不能解決所有的問題,只能解決可擴展性。當然,現在的互聯網軟件,擴展性是最重要的。
3.對象和類的概念
在python中,壹切都是對象,對象應該有自己的屬性,也就是特性,有自己的函數,也就是方法。
在Python中,特征由變量表示,函數由函數表示,因此對象是變量和函數的組合。
而從各種具有相同特征和功能的對象中提取出來的就是類,所以類是壹系列具有相同特征和功能的對象的組合。
讓我們以類似於定義函數的方式定義壹個類:
#定義壹個中國類中文:#***相同特征Country =' China' # * *相同技能Deftalk (self): print('正在說中文')打敗(self): print('正在吃中餐')所以我們定義了壹個類。註:65438。
2.類名通常是大寫的,冒號前不需要括號,這和函數定義不同。
3.與函數不同,類會在定義階段執行類中的代碼。
4.壹個類有兩種屬性。* * *的特性叫數據屬性,* * *的功能叫功能屬性。
如何從這個類生成壹個對象?實例化:
p 1 =中文()
P2 =中文()我們可以得出壹個結論,不管現實世界中發生了什麽,在程序中,確實是先有類再有對象。
我們通過實例化獲得了兩個對象,但是有壹個問題。所獲得的兩個物體的特征和功能是相同的。這種認為壹切都是物體的想法是完全不符合的。應該是每個對象都不壹樣,所以這個世界才有意思。
其實我們在定義類的時候,忘了定義函數__init__()。正確的定義方法應該如下:
#定義壹類中國人:# * * *相同特征country = ' China ' # Initialize def _ _ init _(self,name,age):
Self.name=name #每壹個對象都有自己的名字self.age=age #每壹個對象都有自己的年齡# * * *相同技能deftalk (self): print('是在說中文')failure(self):print('是在吃中餐')#實例化產生壹個對象P1 =中文('張',18)。括號是實例化,實例化會自動觸發__init__函數運行,可以用來為每個對象定制自己的特性。
當我們定義__init__函數時,括號中有三個參數,但是當我們實例化調用時,我們只傳遞兩個值。為什麽不報告壹個錯誤?這是因為self的作用是在實例化時自動將對象本身傳遞給__init__函數的第壹個參數。當然,自我只是壹個名字,埃貢老師說過,妳瞎寫幾個字,別人是看不懂的。
註意。這種自動的值傳遞機制只有在實例化時才會體現出來。類除了實例化,還有壹個屬性引用的功能,方法是類名和屬性。
#數據屬性打印(中文.國家)#中國#功能屬性#中文。talk () # typeerror: talk()缺少1必需的位置參數:“self”print(中文。talk)# < function Chinese . talk at 0x 000001 bc5f 13d 1 E0 & gt;中國人。talk(' self ')# ISTalking Chinese # Add attribute Chinese . color = ' yellow ' # Delete attribute del Chinese . color從上面的錯誤碼可以看出,在引用屬性的時候,並不存在自動傳值這壹說。
我們已經學習了名稱空間的概念。定義壹個變量或函數會在內存中打開壹個存儲空間。類中還有變量(數據屬性)和函數(函數屬性),它們也有命名空間,可以通過。__詞典_ _
p 1 =中文('張',18)打印(中文。_ _ dict _ _)# { ' _ _ module _ _ ':' _ _ main _ _ ',' country': 'China ',' _ _ init _ _ ':& lt;函數中文。_ _ # init _ _ at 0x 000002187 f35d 158 & gt;,' talk ':& lt;函數Chinese . talk at 0x 000002187 f35d 1 E0 & gt;,# '吃':& lt函數Chinese . eat at 0x 000002187 f35d 268 & gt;,' _ _ # dict _ _ ':& lt;“中文”對象的屬性“_ _ dict _ _ ”& gt;,# ' _ _ weak ref _ _ ':& lt;“中文”對象的屬性“_ _ weak ref _ _ ”& gt;,' _ _ doc _ _': none}打印(p1。_ _ dict _ _) # {'name':' zhang ',' age': 18}從上面代碼顯示的結果中我們知道,打印實例化對象的命名空間只是顯示其自身唯壹的屬性。
還有壹個問題。對象的命名空間中沒有函數屬性。當然也是在類中找,但是不同對象指定的函數是函數嗎?
p 1 =中文('張',18)
p2 =中文('李',19)print(Chinese . talk)# & lt;函數Chinese . talk at 0x 000001 b8 a5 b7d 1 E0 & gt;print(p 1 . talk)# & lt;關於& lt__main__。0x 0000001 b 8 a 5b 7 BD 68 >處的中文對象;& gtprint(p2 . talk)# & lt;關於& lt__main__。0x 000001 b 8 a 5b 7 BDA 0 & gt;& gt如妳所見,不,它們的內存地址都不壹樣。請註意,綁定方法是壹個綁定方法。
對象本身只有數據屬性,但是Python的類機制把類的函數綁定到對象上,這叫做對象的方法,或者說綁定方法。綁定方法只綁定壹個對象,同壹類的方法綁定到不同的對象,屬於不同的方法。我們可以驗證:
當使用這個函數時:類調用函數屬性。既然是函數,那就是帶括號的函數名,還有參數要傳。
當壹個對象使用這個函數時,它沒有函數屬性。這是壹種綁定方法。如何使用綁定方法也是直接用括號括起來的,不同的是綁定方法默認會把對象本身作為第壹個參數。
中文課:
country='China'def __init__(本人,姓名,年齡):
self.name=name
self . age = age def talk(self):print(' % s正在說中文' % self . name ' def eat(self):print('正在吃中餐')
p 1 =中文('張',18)
p2 =中文('李',19)
中國人。說話(p1) #張說的是中文1。talk () #張在說中文只要是綁定方法就會自動傳值!其實我們之前也接觸過這個。在python3中,壹個類型就是壹個類。list、tuple、set、dict等數據類型其實都是類,我們之前用的方法,比如l1.append(3),也可以寫成l1.append(l1,3)。
未完待續。。