溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

python面向?qū)ο缶幊淘趺磳?shí)現(xiàn)

發(fā)布時(shí)間:2022-10-12 15:18:08 來(lái)源:億速云 閱讀:170 作者:iii 欄目:web開(kāi)發(fā)

這篇文章主要介紹“python面向?qū)ο缶幊淘趺磳?shí)現(xiàn)”,在日常操作中,相信很多人在python面向?qū)ο缶幊淘趺磳?shí)現(xiàn)問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”python面向?qū)ο缶幊淘趺磳?shí)現(xiàn)”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

對(duì)象的概念

”面向?qū)ο蟆暗暮诵氖恰皩?duì)象”二字,而對(duì)象的精髓在于“整合“

所有的程序都是由”數(shù)據(jù)”與“功能“組成,因而編寫(xiě)程序的本質(zhì)就是定義出一系列的數(shù)據(jù),然后定義出一系列的功能來(lái)對(duì)數(shù)據(jù)進(jìn)行操作。在學(xué)習(xí)”對(duì)象“之前,程序中的數(shù)據(jù)與功能是分離開(kāi)的,如下

數(shù)據(jù):
name = cjk
age = 18
功能:
def tell_info(name, age)
     print('<%s:%:%s>' %(name, age))
 
tell_info(name,age)

在學(xué)習(xí)了“對(duì)象”之后,我們就有了一個(gè)容器,該容器可以盛放數(shù)據(jù)與功能,所以我們可以說(shuō):對(duì)象是把數(shù)據(jù)與功能整合到一起的產(chǎn)物,或者說(shuō)”對(duì)象“就是一個(gè)盛放數(shù)據(jù)與功能的容器/箱子/盒子。

如果把”數(shù)據(jù)“比喻為”球衣“、”秋衣“、”襪子“等化妝所需要的原材料;把”功能“比喻”球衣“、”秋衣“、”襪子“所需要的工具,那么”對(duì)象“就是一個(gè)收納盒,彩收納盒可以把”原材料“與”工具“都裝到一起

在了解了對(duì)象的基本概念之后,理解面向?qū)ο蟮木幊谭绞骄拖鄬?duì)簡(jiǎn)單很多了,面向?qū)ο缶幊叹褪且斐鲆粋€(gè)個(gè)的對(duì)象,把原本分散開(kāi)的相關(guān)數(shù)據(jù)與功能整合到一個(gè)個(gè)的對(duì)象里,這么做既方便使用,也可以提高程序的解耦合程度,進(jìn)而提升了程序的可擴(kuò)展性(需要強(qiáng)調(diào)的是,軟件質(zhì)量屬性包含很多方面,面向?qū)ο蠼鉀Q的僅僅只是擴(kuò)展性問(wèn)題)


python面向?qū)ο缶幊淘趺磳?shí)現(xiàn)

類(lèi)與對(duì)象

類(lèi)即類(lèi)別/種類(lèi),是面向?qū)ο蠓治龊驮O(shè)計(jì)的基石,如果多個(gè)對(duì)象有相似的數(shù)據(jù)與功能,那么該多個(gè)對(duì)象就屬于同一種類(lèi)。有了類(lèi)的好處是:我們可以把同一類(lèi)對(duì)象相同的數(shù)據(jù)與功能存放到類(lèi)里,而無(wú)需每個(gè)對(duì)象都重復(fù)存一份,這樣每個(gè)對(duì)象里只需存自己獨(dú)有的數(shù)據(jù)即可,極大地節(jié)省了空間。所以,如果說(shuō)對(duì)象是用來(lái)存放數(shù)據(jù)與功能的容器,那么類(lèi)則是用來(lái)存放多個(gè)對(duì)象相同的數(shù)據(jù)與功能的容器。

python面向?qū)ο缶幊淘趺磳?shí)現(xiàn)

綜上所述,雖然我們是先介紹對(duì)象后介紹類(lèi),但是需要強(qiáng)調(diào)的是:在程序中,必須要事先定義類(lèi),然后再調(diào)用類(lèi)產(chǎn)生對(duì)象(調(diào)用類(lèi)拿到的返回值就是對(duì)象)。產(chǎn)生對(duì)象的類(lèi)與對(duì)象之間存在關(guān)聯(lián),這種關(guān)聯(lián)指的是:對(duì)象可以訪問(wèn)到類(lèi)中共有的數(shù)據(jù)與功能,所以類(lèi)中的內(nèi)容仍然是屬于對(duì)象的,類(lèi)只不過(guò)是一種節(jié)省空間、減少代碼冗余的機(jī)制,面向?qū)ο缶幊套罱K的核心仍然是去使用對(duì)象。

在了解了類(lèi)與對(duì)象這兩大核心概念之后,我們就可以來(lái)介紹一下面向?qū)ο缶幊汤病?/p>

面向?qū)ο缶幊?/h5>
類(lèi)的定義與實(shí)例化

我們以開(kāi)發(fā)一個(gè)選課系統(tǒng)為例,來(lái)簡(jiǎn)單介紹基于面向?qū)ο蟮乃枷肴绾尉帉?xiě)程序

面向?qū)ο蟮幕舅悸肪褪前殉绦蛑幸玫降?、相關(guān)聯(lián)的數(shù)據(jù)與功能整合到對(duì)象里,然后再去使用,但程序中要用到的數(shù)據(jù)以及功能那么多,如何找到相關(guān)連的呢?我需要先提取選課系統(tǒng)里的角色:學(xué)生、老師、課程等,然后顯而易見(jiàn)的是:學(xué)生有學(xué)生相關(guān)的數(shù)據(jù)于功能,老師有老師相關(guān)的數(shù)據(jù)與功能,我們單以學(xué)生為例,

# 學(xué)生的數(shù)據(jù)有
學(xué)校
名字
年齡
性別

# 學(xué)生的功能有
選課

詳細(xì)的

# 學(xué)生1:
    數(shù)據(jù):
        學(xué)校=清華大學(xué)
        姓名=王大錘
        性別=男
        年齡=28
    功能:
        選課

# 學(xué)生2:
    數(shù)據(jù):
        學(xué)校=清華大學(xué)
        姓名=王二錘
        性別=女
        年齡=18
    功能:
        選課

# 學(xué)生3:
    數(shù)據(jù):
        學(xué)校=清華大學(xué)
        姓名=王三錘
        性別=男
        年齡=38
    功能:
        選課

基于上述分析的結(jié)果,我們接下來(lái)需要做的就是在程序中定義出類(lèi),然后調(diào)用類(lèi)產(chǎn)生對(duì)象

class Student: # 類(lèi)的命名應(yīng)該使用“駝峰體”

    school='清華大學(xué)' # 數(shù)據(jù)

    def choose(self): # 功能
        print('%s is choosing a course' %self.name)

類(lèi)體最常見(jiàn)的是變量的定義和函數(shù)的定義,但其實(shí)類(lèi)體可以包含任意Python代碼,類(lèi)體的代碼在類(lèi)定義階段就會(huì)執(zhí)行,因而會(huì)產(chǎn)生新的名稱(chēng)空間用來(lái)存放類(lèi)中定義的名字,可以打印Student.__dict__來(lái)查看類(lèi)這個(gè)容器內(nèi)盛放的東西

調(diào)用類(lèi)的過(guò)程稱(chēng)為將類(lèi)實(shí)例化,拿到的返回值就是程序中的對(duì)象,或稱(chēng)為一個(gè)實(shí)例

A=Student()
B=Student()
C=Student()

如此A,B,C全都一樣了(只有類(lèi)中共有的內(nèi)容,而沒(méi)有各自獨(dú)有的數(shù)據(jù)),想在實(shí)例化的過(guò)程中就為三位學(xué)生定制各自獨(dú)有的數(shù)據(jù):姓名,性別,年齡,需要我們?cè)陬?lèi)內(nèi)部新增一個(gè)__init__方法,如下

class Student:
    school='清華大學(xué)'

    #該方法會(huì)在對(duì)象產(chǎn)生之后自動(dòng)執(zhí)行,專(zhuān)門(mén)為對(duì)象進(jìn)行初始化操作,可以有任意代碼,但一定不能返回非None的值
    def __init__(self,name,sex,age):
        self.name=name
        self.sex=sex
        self.age=age

    def choose(self): 
        print('%s is choosing a course' %self.name)

然后我們重新實(shí)例出三位學(xué)生

A=Student('王大錘','男',28)
B=Student('王二錘','女',19)
C=Student('王三錘','男',18)

單拿A的產(chǎn)生過(guò)程來(lái)分析,調(diào)用類(lèi)會(huì)先產(chǎn)生一個(gè)空對(duì)象A,然后將A連同調(diào)用類(lèi)時(shí)括號(hào)內(nèi)的參數(shù)一起傳給Student.init(A,’王大錘’,’男’,28)

def __init__(self, name, sex, age):
    self.name = name  
    self.sex = sex   
    self.age = age

會(huì)產(chǎn)生對(duì)象的名稱(chēng)空間,同樣可以用__dict__查看

stu1.__dict__
{'name': '王大錘', 'sex': '男', 'age': 28}

至此,我們?cè)斐隽巳齻€(gè)對(duì)象與一個(gè)類(lèi),對(duì)象存放各自獨(dú)有的數(shù)據(jù),類(lèi)中存放對(duì)象們共有的內(nèi)容

屬性訪問(wèn)
類(lèi)屬性與對(duì)象屬性

在類(lèi)中定義的名字,都是類(lèi)的屬性,細(xì)說(shuō)的話,類(lèi)有兩種屬性:數(shù)據(jù)屬性和函數(shù)屬性,可以通過(guò)__dict__訪問(wèn)屬性的值,比如Student.dict[‘school’],但Python提供了專(zhuān)門(mén)的屬性訪問(wèn)語(yǔ)法

Student.school # 訪問(wèn)數(shù)據(jù)屬性,等同于Student.__dict__['school']
Student.choose # 訪問(wèn)函數(shù)屬性,等同于Student.__dict__['choose']
屬性查找順序與綁定方法

對(duì)象的名稱(chēng)空間里只存放著對(duì)象獨(dú)有的屬性,而對(duì)象們相似的屬性是存放于類(lèi)中的。對(duì)象在訪問(wèn)屬性時(shí),會(huì)優(yōu)先從對(duì)象本身的__dict__中查找,未找到,則去類(lèi)的__dict__中查找

1、類(lèi)中定義的變量是類(lèi)的數(shù)據(jù)屬性,是共享給所有對(duì)象用的,指向相同的內(nèi)存地址

# id都一樣
print(id(Student.school)) # 4301108704

print(id(A.school)) # 4301108704
print(id(B.school)) # 4301108704
print(id(C.school)) # 4301108704

2、類(lèi)中定義的函數(shù)是類(lèi)的函數(shù)屬性,類(lèi)可以使用,但必須遵循函數(shù)的參數(shù)規(guī)則,有幾個(gè)參數(shù)需要傳幾個(gè)參數(shù)

Student.choose(A) # 王大錘 is choosing a course
Student.choose(B) # 王二錘 is choosing a course
Student.choose(C) # 王三錘 is choosing a course

但其實(shí)類(lèi)中定義的函數(shù)主要是給對(duì)象使用的,而且是綁定給對(duì)象的,雖然所有對(duì)象指向的都是相同的功能,但是綁定到不同的對(duì)象就是不同的綁定方法,內(nèi)存地址各不相同

print(id(Student.choose)) # 4335426280

print(id(A.choose)) # 4300433608
print(id(B.choose)) # 4300433608
print(id(C.choose)) # 4300433608

綁定到對(duì)象的方法特殊之處在于,綁定給誰(shuí)就應(yīng)該由誰(shuí)來(lái)調(diào)用,誰(shuí)來(lái)調(diào)用,就會(huì)將’誰(shuí)’本身當(dāng)做第一個(gè)參數(shù)自動(dòng)傳入(方法__init__也是一樣的道理)

A.choose()  # 等同于Student.choose(A)
B.choose()  # 等同于Student.choose(B)
C.choose()  # 等同于Student.choose(C)

綁定到不同對(duì)象的choose技能,雖然都是選課,但大錘選的課,不會(huì)選給二錘,這正是”綁定“二字的精髓所在。

綁定到對(duì)象方法的這種自動(dòng)傳值的特征,決定了在類(lèi)中定義的函數(shù)都要默認(rèn)寫(xiě)一個(gè)參數(shù)self,self可以是任意名字,但命名為self是約定俗成的。

Python中一切皆為對(duì)象,且Python3中類(lèi)與類(lèi)型是一個(gè)概念

到此,關(guān)于“python面向?qū)ο缶幊淘趺磳?shí)現(xiàn)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI