Python 面向?qū)ο蟛糠种R點(diǎn)小結(jié)
本文實(shí)例講述了Python 面向?qū)ο蟛糠种R點(diǎn)。分享給大家供大家參考,具體如下:
面向?qū)ο螅?/b>
世間萬物,皆可分類。--------------------手機(jī)《--------------某一個分類
世間萬物,皆為對象。--------------------我的手機(jī)《---------有具體指向
只要是對象,就肯定屬于某種品類。
只要是對象,就肯定有屬性。
類的相同點(diǎn)一起寫,不同點(diǎn)分開寫。
1.Python類中self的來源:
通常函數(shù)的執(zhí)行方式為:
調(diào)用函數(shù)--》執(zhí)行函數(shù)----》返回該函數(shù)的執(zhí)行結(jié)果(得到一個內(nèi)存地址)
Python類中方法卻不是這樣執(zhí)行的,
而是在實(shí)例化對象的同時也將此時的對象名稱傳入。然后在類中__init__需要一個參數(shù)接受該對象,故選用self,self代表的是當(dāng)前對象的引用,指向的是同一塊內(nèi)存地址,所以不需要使用return返回值。
2.為什么類中的方法最少有一個self參數(shù)?
這是由于類中的方法是類內(nèi)部共存(共享)的,不像其他字段屬性每次都在內(nèi)存中復(fù)制得有,但是得知道每次調(diào)用該方法的對象是誰,需要將調(diào)用這個方法的對象傳遞到該方法中,故需要一個self接收該對象。在底層是通過----》類.方法(對象名)實(shí)現(xiàn)該過程的。最終的實(shí)現(xiàn)是誰調(diào)用這個方法,誰就把自己傳遞給該方法。 類名.方法名(類的對象)
r=Role(‘WFB’) Role是一個類,類中有一個got_shot()方法。
r.got_shot()======》實(shí)質(zhì)為Role.got_shot(r)
3.在構(gòu)造函數(shù)中初始化:在內(nèi)存中開辟一塊空間,然后將一些值進(jìn)行存儲。對于沒有在構(gòu)造函數(shù)中初始化的方法是在類的內(nèi)存當(dāng)中的,而不是在實(shí)例的內(nèi)存空間里。
4.python 類變量和實(shí)例變量
類變量既可以通過實(shí)例也可以通過類來訪問,這是因?yàn)樵L問順序是默認(rèn)先訪問實(shí)例的,若實(shí)例中沒有則來訪問類的。
實(shí)例變量是可以增加的,也是可以刪除的,體現(xiàn)為:
4.1增加
4.1.1 在類初始化時是通過構(gòu)造函數(shù)__init__()中接收的self參數(shù)然后進(jìn)行賦值,如下
class Role: def __init__(self, name): #在實(shí)例化時做一些類的初始化的工作 self.name = name #實(shí)質(zhì)為r1.name=name實(shí)例變量(靜態(tài)屬性),作用域就是實(shí)例本身
實(shí)質(zhì)為:
r=Role('wfb')===>r=Role(r,'wfb') ,然后通過r.name=name在構(gòu)造函數(shù)中進(jìn)行賦值。
4.1.2 在類實(shí)例后單獨(dú)增加,現(xiàn)在新增一個實(shí)例變量范圍只針對該實(shí)例。
例如:
r=Role('wfb')r.gender='男'
上述兩者實(shí)質(zhì)是一樣的,只是賦值時間有區(qū)別,一個是在類在實(shí)例化(調(diào)用構(gòu)造函數(shù))時賦值。一個是在實(shí)例化之后再在賦值操作。同樣可以達(dá)到為某實(shí)例增加屬性的目的。
4.2刪除
刪除實(shí)例變量(只是針對當(dāng)前的對象)。
方式為=>
del r.name
這樣該實(shí)例就沒有了該變量,但是不會影響其他的實(shí)例變量。
5.在實(shí)例中是否可以改類中的類變量??
class Role:n='我是類變量' def __init__(self, name): #在實(shí)例化時做一些類的初始化的工作 self.name = name #實(shí)質(zhì)為r1.name=name實(shí)例變量(靜態(tài)屬性),作用域就是實(shí)例本身r1=Role('wfb')r1.n='我是修改后變量'Print('r.n===%s'%r.n) #=====>輸出我是修改后變量r2=Role('WFB Nice')Print('r2.n===%s'%r2.n) #======>輸出為我是類類變量。#先在實(shí)例中查找是否有n,沒有則去查找類中是否有。
總結(jié):通過試驗(yàn)可以知道 我們通過實(shí)例修改類中同名的變量,實(shí)質(zhì)為是在該實(shí)例的內(nèi)存中新增了一個與類變量同名的實(shí)例變量。其他實(shí)例來調(diào)用該類中的類變量時,其中類變量的值是沒有發(fā)生變化的。
6.通過類是否可以直接修改類的的類變量??【類名.類變量==值】、
結(jié)論為:若實(shí)例中已有新增的與類變量同名的則變量值為實(shí)例中的變量值,否則則是修改后的類變量值,這是由于訪問順序是默認(rèn)先訪問實(shí)例的,若實(shí)例中沒有則來訪問類的。
需要注意的是若變量是一個list則修改一個影響全部,這是由于他們共用的是同一個內(nèi)存地址。
實(shí)例變量是為了區(qū)別每個對象的不同點(diǎn),而類變量是該類所用實(shí)例對象共用的。當(dāng)某個對象實(shí)例中關(guān)于這個類變量需要不同值,可以為該對象實(shí)例新增一個與類變量同名的實(shí)例變量。
7.私有屬性、私有方法=====》體現(xiàn)了封裝
格式為:
私有屬性:__attr
私有方法:def __way(self): pass
特性:只能是在改類中訪問,若外部需要私有屬性或者方法,解決方法為在該類的內(nèi)部定義一個可供外部訪問的方法,然后在該方法中調(diào)用私有屬性或方法。
8.繼承
繼承是指這樣一種能力:它可以使用現(xiàn)有類的所有功能,并在無需重新編寫原來的類的情況下對這些功能進(jìn)行擴(kuò)展。
繼承概念的實(shí)現(xiàn)方式主要有2類:實(shí)現(xiàn)繼承、接口繼承。
實(shí)現(xiàn)繼承是指使用基類的屬性和方法而無需額外編碼的能力。
接口繼承是指僅使用屬性和方法的名稱、但是子類必須提供實(shí)現(xiàn)的能力(子類重構(gòu)父類方法)。
8.1 類的繼承
8.1.1 繼承的定義
class Person(object): # 定義一個父類 def talk(self): # 父類中的方法 print('person is talking....') class Chinese(Person): # 定義一個子類, 繼承Person類 def walk(self): # 在子類中定義其自身的方法 print(’is walking...’)c = Chinese()c.talk() # 調(diào)用繼承的Person類的方法c.walk() # 調(diào)用本身的方法
輸出
person is talking....is walking...
8.1.2 構(gòu)造函數(shù)的繼承
如果我們要給實(shí)例 c 傳參,我們就要使用到構(gòu)造函數(shù),那么構(gòu)造函數(shù)該如何繼承,同時子類中又如何定義自己的屬性?
繼承類的構(gòu)造方法:
1.經(jīng)典類的寫法: 父類名稱.__init__(self,參數(shù)1,參數(shù)2,...)
2. 新式類的寫法:super(子類,self).__init__(參數(shù)1,參數(shù)2,....)
class Person(object): def __init__(self, name, age): self.name = name self.age = age def talk(self): print('person is talking....')class Chinese(Person): def __init__(self, name, age, language): # 先繼承,在重構(gòu) Person.__init__(self, name, age) #繼承父類的構(gòu)造方法,也可以寫成:super(Chinese,self).__init__(name,age) self.language = language # 定義類的本身屬性 def walk(self): print(’is walking...’)class American(Person): passc = Chinese(’wfb’, 22, ’Chinese’)
總結(jié):假如只是簡單的在子類Chinese中定義一個構(gòu)造函數(shù),其實(shí)就是在重構(gòu)。這樣子類就不能繼承父類的屬性了。所以我們在定義子類的構(gòu)造函數(shù)時,要先繼承再構(gòu)造,這樣我們也能獲取父類的屬性了。
子類構(gòu)造函數(shù)基礎(chǔ)父類構(gòu)造函數(shù)過程如下:
實(shí)例化對象c ----> c 調(diào)用子類__init__() ---- > 子類__init__()繼承父類__init__() ----- > 調(diào)用父類 __init__()
8.1.3 對父類方法的繼承
如果我們對基類/父類的方法需要修改,可以在子類中重構(gòu)該方法。如下的talk()方法。
class Person(object): def __init__(self, name, age): self.name = name self.age = age def talk(self): print('person is talking....')class Chinese(Person): def __init__(self, name, age, language): Person.__init__(self, name, age) self.language = language print(self.name, self.age, self.language) def talk(self): # 子類 重構(gòu)方法 print(’%s is speaking chinese’ % self.name) def walk(self): print(’is walking...’)c = Chinese(’wfb’, 22, ’Chinese’)c.talk()
輸出
wfb is speaking chinese
關(guān)于多繼承是按照從左到右【代碼中提現(xiàn)方式】繼承的,在繼承上存在一個先后關(guān)系,其中構(gòu)造函數(shù)只會繼承一個(從從左到右誰先有就繼承誰的)。
例如:
class A: def __init__(self): print('A')class B(A): def __init__(self): print('B')class C(A): def __init__(self): print('C') class D(B, C): passd = D()# 結(jié)果輸出的為B
特別的:
9. 多態(tài):一個接口多種實(shí)現(xiàn)。 作用:接口重用。
學(xué)習(xí)git為 https://gitee.com/FelixBinCloud/PythonLearn/tree/master/PythonLearn
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python面向?qū)ο蟪绦蛟O(shè)計入門與進(jìn)階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門與進(jìn)階經(jīng)典教程》
希望本文所述對大家Python程序設(shè)計有所幫助。
相關(guān)文章:
1. 推薦一個好看Table表格的css樣式代碼詳解2. 三個不常見的 HTML5 實(shí)用新特性簡介3. asp批量添加修改刪除操作示例代碼4. msxml3.dll 錯誤 800c0019 系統(tǒng)錯誤:-2146697191解決方法5. 刪除docker里建立容器的操作方法6. asp在iis7報錯行號不準(zhǔn)問題的解決方法7. CSS3實(shí)現(xiàn)動態(tài)翻牌效果 仿百度貼吧3D翻牌一次動畫特效8. ASP中解決“對象關(guān)閉時,不允許操作。”的詭異問題……9. asp讀取xml文件和記數(shù)10. 概述IE和SQL2k開發(fā)一個XML聊天程序
