Python 面向?qū)ο蟛糠种R(shí)點(diǎn)小結(jié)
本文實(shí)例講述了Python 面向?qū)ο蟛糠种R(shí)點(diǎn)。分享給大家供大家參考,具體如下:
面向?qū)ο螅?/strong>
世間萬(wàn)物,皆可分類(lèi)。--------------------手機(jī)《--------------某一個(gè)分類(lèi)
世間萬(wàn)物,皆為對(duì)象。--------------------我的手機(jī)《---------有具體指向
只要是對(duì)象,就肯定屬于某種品類(lèi)。
只要是對(duì)象,就肯定有屬性。
類(lèi)的相同點(diǎn)一起寫(xiě),不同點(diǎn)分開(kāi)寫(xiě)。
1.Python類(lèi)中self的來(lái)源:
通常函數(shù)的執(zhí)行方式為:
調(diào)用函數(shù)--》執(zhí)行函數(shù)----》返回該函數(shù)的執(zhí)行結(jié)果(得到一個(gè)內(nèi)存地址)
Python類(lèi)中方法卻不是這樣執(zhí)行的,
而是在實(shí)例化對(duì)象的同時(shí)也將此時(shí)的對(duì)象名稱(chēng)傳入。然后在類(lèi)中__init__需要一個(gè)參數(shù)接受該對(duì)象,故選用self,self代表的是當(dāng)前對(duì)象的引用,指向的是同一塊內(nèi)存地址,所以不需要使用return返回值。
2.為什么類(lèi)中的方法最少有一個(gè)self參數(shù)?
這是由于類(lèi)中的方法是類(lèi)內(nèi)部共存(共享)的,不像其他字段屬性每次都在內(nèi)存中復(fù)制得有,但是得知道每次調(diào)用該方法的對(duì)象是誰(shuí),需要將調(diào)用這個(gè)方法的對(duì)象傳遞到該方法中,故需要一個(gè)self接收該對(duì)象。在底層是通過(guò)----》類(lèi).方法(對(duì)象名)實(shí)現(xiàn)該過(guò)程的。最終的實(shí)現(xiàn)是誰(shuí)調(diào)用這個(gè)方法,誰(shuí)就把自己傳遞給該方法。 類(lèi)名.方法名(類(lèi)的對(duì)象)
r=Role(‘WFB') Role是一個(gè)類(lèi),類(lèi)中有一個(gè)got_shot()方法。
r.got_shot()======》實(shí)質(zhì)為Role.got_shot(r)
3.在構(gòu)造函數(shù)中初始化:在內(nèi)存中開(kāi)辟一塊空間,然后將一些值進(jìn)行存儲(chǔ)。對(duì)于沒(méi)有在構(gòu)造函數(shù)中初始化的方法是在類(lèi)的內(nèi)存當(dāng)中的,而不是在實(shí)例的內(nèi)存空間里。
4.python 類(lèi)變量和實(shí)例變量
類(lèi)變量既可以通過(guò)實(shí)例也可以通過(guò)類(lèi)來(lái)訪(fǎng)問(wèn),這是因?yàn)樵L(fǎng)問(wèn)順序是默認(rèn)先訪(fǎng)問(wèn)實(shí)例的,若實(shí)例中沒(méi)有則來(lái)訪(fǎng)問(wèn)類(lèi)的。
實(shí)例變量是可以增加的,也是可以刪除的,體現(xiàn)為:
4.1增加
4.1.1 在類(lèi)初始化時(shí)是通過(guò)構(gòu)造函數(shù)__init__()中接收的self參數(shù)然后進(jìn)行賦值,如下
class Role:
def __init__(self, name):
#在實(shí)例化時(shí)做一些類(lèi)的初始化的工作
self.name = name #實(shí)質(zhì)為r1.name=name實(shí)例變量(靜態(tài)屬性),作用域就是實(shí)例本身
實(shí)質(zhì)為:
r=Role("wfb")===>r=Role(r,"wfb") ,然后通過(guò)r.name=name在構(gòu)造函數(shù)中進(jìn)行賦值。
4.1.2 在類(lèi)實(shí)例后單獨(dú)增加,現(xiàn)在新增一個(gè)實(shí)例變量范圍只針對(duì)該實(shí)例。
例如:
r=Role("wfb")
r.gender="男"
上述兩者實(shí)質(zhì)是一樣的,只是賦值時(shí)間有區(qū)別,一個(gè)是在類(lèi)在實(shí)例化(調(diào)用構(gòu)造函數(shù))時(shí)賦值。一個(gè)是在實(shí)例化之后再在賦值操作。同樣可以達(dá)到為某實(shí)例增加屬性的目的。
4.2刪除
刪除實(shí)例變量(只是針對(duì)當(dāng)前的對(duì)象)。
方式為=>
del r.name
這樣該實(shí)例就沒(méi)有了該變量,但是不會(huì)影響其他的實(shí)例變量。
5.在實(shí)例中是否可以改類(lèi)中的類(lèi)變量??
class Role:
n="我是類(lèi)變量"
def __init__(self, name):
#在實(shí)例化時(shí)做一些類(lèi)的初始化的工作
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) #======>輸出為我是類(lèi)類(lèi)變量。
#先在實(shí)例中查找是否有n,沒(méi)有則去查找類(lèi)中是否有。
總結(jié):通過(guò)試驗(yàn)可以知道 我們通過(guò)實(shí)例修改類(lèi)中同名的變量,實(shí)質(zhì)為是在該實(shí)例的內(nèi)存中新增了一個(gè)與類(lèi)變量同名的實(shí)例變量。其他實(shí)例來(lái)調(diào)用該類(lèi)中的類(lèi)變量時(shí),其中類(lèi)變量的值是沒(méi)有發(fā)生變化的。
6.通過(guò)類(lèi)是否可以直接修改類(lèi)的的類(lèi)變量??【類(lèi)名.類(lèi)變量==值】、
結(jié)論為:若實(shí)例中已有新增的與類(lèi)變量同名的則變量值為實(shí)例中的變量值,否則則是修改后的類(lèi)變量值,這是由于訪(fǎng)問(wèn)順序是默認(rèn)先訪(fǎng)問(wèn)實(shí)例的,若實(shí)例中沒(méi)有則來(lái)訪(fǎng)問(wèn)類(lèi)的。
需要注意的是若變量是一個(gè)list則修改一個(gè)影響全部,這是由于他們共用的是同一個(gè)內(nèi)存地址。
實(shí)例變量是為了區(qū)別每個(gè)對(duì)象的不同點(diǎn),而類(lèi)變量是該類(lèi)所用實(shí)例對(duì)象共用的。當(dāng)某個(gè)對(duì)象實(shí)例中關(guān)于這個(gè)類(lèi)變量需要不同值,可以為該對(duì)象實(shí)例新增一個(gè)與類(lèi)變量同名的實(shí)例變量。
7.私有屬性、私有方法=====》體現(xiàn)了封裝
格式為:
私有屬性:__attr
私有方法:def __way(self): pass
特性:只能是在改類(lèi)中訪(fǎng)問(wèn),若外部需要私有屬性或者方法,解決方法為在該類(lèi)的內(nèi)部定義一個(gè)可供外部訪(fǎng)問(wèn)的方法,然后在該方法中調(diào)用私有屬性或方法。
8.繼承
繼承是指這樣一種能力:它可以使用現(xiàn)有類(lèi)的所有功能,并在無(wú)需重新編寫(xiě)原來(lái)的類(lèi)的情況下對(duì)這些功能進(jìn)行擴(kuò)展。
繼承概念的實(shí)現(xiàn)方式主要有2類(lèi):實(shí)現(xiàn)繼承、接口繼承。
實(shí)現(xiàn)繼承是指使用基類(lèi)的屬性和方法而無(wú)需額外編碼的能力。
接口繼承是指僅使用屬性和方法的名稱(chēng)、但是子類(lèi)必須提供實(shí)現(xiàn)的能力(子類(lèi)重構(gòu)父類(lèi)方法)。
8.1 類(lèi)的繼承
8.1.1 繼承的定義
class Person(object): # 定義一個(gè)父類(lèi)
def talk(self): # 父類(lèi)中的方法
print("person is talking....")
class Chinese(Person): # 定義一個(gè)子類(lèi), 繼承Person類(lèi)
def walk(self): # 在子類(lèi)中定義其自身的方法
print('is walking...')
c = Chinese()
c.talk() # 調(diào)用繼承的Person類(lèi)的方法
c.walk() # 調(diào)用本身的方法
輸出
person is talking....
is walking...
8.1.2 構(gòu)造函數(shù)的繼承
如果我們要給實(shí)例 c 傳參,我們就要使用到構(gòu)造函數(shù),那么構(gòu)造函數(shù)該如何繼承,同時(shí)子類(lèi)中又如何定義自己的屬性?
繼承類(lèi)的構(gòu)造方法:
1.經(jīng)典類(lèi)的寫(xiě)法: 父類(lèi)名稱(chēng).__init__(self,參數(shù)1,參數(shù)2,...)
2. 新式類(lèi)的寫(xiě)法:super(子類(lèi),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) #繼承父類(lèi)的構(gòu)造方法,也可以寫(xiě)成:super(Chinese,self).__init__(name,age)
self.language = language # 定義類(lèi)的本身屬性
def walk(self):
print('is walking...')
class American(Person):
pass
c = Chinese('wfb', 22, 'Chinese')
總結(jié):假如只是簡(jiǎn)單的在子類(lèi)Chinese中定義一個(gè)構(gòu)造函數(shù),其實(shí)就是在重構(gòu)。這樣子類(lèi)就不能繼承父類(lèi)的屬性了。所以我們?cè)诙x子類(lèi)的構(gòu)造函數(shù)時(shí),要先繼承再構(gòu)造,這樣我們也能獲取父類(lèi)的屬性了。
子類(lèi)構(gòu)造函數(shù)基礎(chǔ)父類(lèi)構(gòu)造函數(shù)過(guò)程如下:
實(shí)例化對(duì)象c ----> c 調(diào)用子類(lèi)__init__() ---- > 子類(lèi)__init__()繼承父類(lèi)__init__() ----- > 調(diào)用父類(lèi) __init__()
8.1.3 對(duì)父類(lèi)方法的繼承
如果我們對(duì)基類(lèi)/父類(lèi)的方法需要修改,可以在子類(lèi)中重構(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): # 子類(lèi) 重構(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)方式】繼承的,在繼承上存在一個(gè)先后關(guān)系,其中構(gòu)造函數(shù)只會(huì)繼承一個(gè)(從從左到右誰(shuí)先有就繼承誰(shuí)的)。
例如:
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):
pass
d = D()
# 結(jié)果輸出的為B
特別的:

9. 多態(tài):一個(gè)接口多種實(shí)現(xiàn)。 作用:接口重用。
學(xué)習(xí)git為 https://gitee.com/FelixBinCloud/PythonLearn/tree/master/PythonLearn
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Python面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)與進(jìn)階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門(mén)與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
如何通過(guò)python實(shí)現(xiàn)IOU計(jì)算代碼實(shí)例
這篇文章主要介紹了如何通過(guò)python實(shí)現(xiàn)IOU計(jì)算代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
pyhton Sanic框架的文件上傳功能開(kāi)發(fā)實(shí)戰(zhàn)示例教程
Sanic是一個(gè)Python 3.5+的異步Web框架,它的設(shè)計(jì)理念與Flask相似,但采用了更高效的異步I/O處理,在處理文件上傳時(shí),Sanic同樣提供了方便、高效的方法,本教程將結(jié)合實(shí)際案例,詳細(xì)介紹如何在Sanic框架中實(shí)現(xiàn)文件上傳的功能,感興趣的朋友跟隨小編一起看看吧2024-08-08
python的pyecharts繪制各種圖表詳細(xì)(附代碼)
這篇文章主要介紹了python的pyecharts繪制各種圖表詳細(xì)(附代碼),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
Python實(shí)現(xiàn)轉(zhuǎn)換圖片背景顏色代碼
這篇文章主要介紹了Python實(shí)現(xiàn)轉(zhuǎn)換圖片背景顏色代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
PyQt通過(guò)動(dòng)畫(huà)實(shí)現(xiàn)平滑滾動(dòng)的QScrollArea
這篇文章主要為大家詳細(xì)介紹了PyQt如何使用Qt的動(dòng)畫(huà)框架 QPropertyAnimation來(lái)實(shí)現(xiàn)平滑滾動(dòng)的QScrollArea,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的可以學(xué)習(xí)一下2023-01-01

