日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

Python学习教程(Python学习路线):Day08-面向对象编程基础

發(fā)布時(shí)間:2025/3/20 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python学习教程(Python学习路线):Day08-面向对象编程基础 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Python學(xué)習(xí)教程(Python學(xué)習(xí)路線):面向?qū)ο缶幊袒A(chǔ)

活在當(dāng)下的程序員應(yīng)該都聽過“面向?qū)ο缶幊獭币辉~,也經(jīng)常有人問能不能用一句話解釋下什么是“面向?qū)ο缶幊獭?#xff0c;我們先來看看比較正式的說法。

把一組數(shù)據(jù)結(jié)構(gòu)和處理它們的方法組成對(duì)象(object),把相同行為的對(duì)象歸納為類(class),通過類的封裝(encapsulation)隱藏內(nèi)部細(xì)節(jié),通過繼承(inheritance)實(shí)現(xiàn)類的特化(specialization)和泛化(generalization),通過多態(tài)(polymorphism)實(shí)現(xiàn)基于對(duì)象類型的動(dòng)態(tài)分派。

這樣一說是不是更不明白了。所以我們還是看看更通俗易懂的說法,下面這段內(nèi)容來自于知乎。

說明:?以上的內(nèi)容來自于網(wǎng)絡(luò),不代表作者本人的觀點(diǎn)和看法,與作者本人立場(chǎng)無關(guān),相關(guān)責(zé)任不由作者承擔(dān)。

之前我們說過“程序是指令的集合”,我們?cè)诔绦蛑袝鴮懙恼Z句在執(zhí)行時(shí)會(huì)變成一條或多條指令然后由CPU去執(zhí)行。當(dāng)然為了簡(jiǎn)化程序的設(shè)計(jì),我們引入了函數(shù)的概念,把相對(duì)獨(dú)立且經(jīng)常重復(fù)使用的代碼放置到函數(shù)中,在需要使用這些功能的時(shí)候只要調(diào)用函數(shù)即可;如果一個(gè)函數(shù)的功能過于復(fù)雜和臃腫,我們又可以進(jìn)一步將函數(shù)繼續(xù)切分為子函數(shù)來降低系統(tǒng)的復(fù)雜性。但是說了這么多,不知道大家是否發(fā)現(xiàn),所謂編程就是程序員按照計(jì)算機(jī)的工作方式控制計(jì)算機(jī)完成各種任務(wù)。但是,計(jì)算機(jī)的工作方式與正常人類的思維模式是不同的,如果編程就必須得拋棄人類正常的思維方式去迎合計(jì)算機(jī),編程的樂趣就少了很多,“每個(gè)人都應(yīng)該學(xué)習(xí)編程”這樣的豪言壯語就只能說說而已。當(dāng)然,這些還不是最重要的,最重要的是當(dāng)我們需要開發(fā)一個(gè)復(fù)雜的系統(tǒng)時(shí),代碼的復(fù)雜性會(huì)讓開發(fā)和維護(hù)工作都變得舉步維艱,所以在上世紀(jì)60年代末期,“軟件危機(jī)”、“軟件工程”等一系列的概念開始在行業(yè)中出現(xiàn)。

當(dāng)然,程序員圈子內(nèi)的人都知道,現(xiàn)實(shí)中并沒有解決上面所說的這些問題的“銀彈”,真正讓軟件開發(fā)者看到希望的是上世紀(jì)70年代誕生的Smalltalk編程語言中引入的面向?qū)ο蟮木幊趟枷?#xff08;面向?qū)ο缶幊痰碾r形可以追溯到更早期的Simula語言)。按照這種編程理念,程序中的數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)是一個(gè)邏輯上的整體,我們稱之為“對(duì)象”,而我們解決問題的方式就是創(chuàng)建出需要的對(duì)象并向?qū)ο蟀l(fā)出各種各樣的消息,多個(gè)對(duì)象的協(xié)同工作最終可以讓我們構(gòu)造出復(fù)雜的系統(tǒng)來解決現(xiàn)實(shí)中的問題。

說明:?當(dāng)然面向?qū)ο笠膊皇墙鉀Q軟件開發(fā)中所有問題的最后的“銀彈”,所以今天的高級(jí)程序設(shè)計(jì)語言幾乎都提供了對(duì)多種編程范式的支持,Python也不例外。

類和對(duì)象

簡(jiǎn)單的說,類是對(duì)象的藍(lán)圖和模板,而對(duì)象是類的實(shí)例。這個(gè)解釋雖然有點(diǎn)像用概念在解釋概念,但是從這句話我們至少可以看出,類是抽象的概念,而對(duì)象是具體的東西。在面向?qū)ο缶幊痰氖澜缰?#xff0c;一切皆為對(duì)象,對(duì)象都有屬性和行為,每個(gè)對(duì)象都是獨(dú)一無二的,而且對(duì)象一定屬于某個(gè)類(型)。當(dāng)我們把一大堆擁有共同特征的對(duì)象的靜態(tài)特征(屬性)和動(dòng)態(tài)特征(行為)都抽取出來后,就可以定義出一個(gè)叫做“類”的東西。

定義類

在Python中可以使用class關(guān)鍵字定義類,然后在類中通過之前學(xué)習(xí)過的函數(shù)來定義方法,這樣就可以將對(duì)象的動(dòng)態(tài)特征描述出來,代碼如下所示。

class Student(object):# __init__是一個(gè)特殊方法用于在創(chuàng)建對(duì)象時(shí)進(jìn)行初始化操作# 通過這個(gè)方法我們可以為學(xué)生對(duì)象綁定name和age兩個(gè)屬性 def __init__(self, name, age): self.name = name self.age = age def study(self, course_name): print('%s正在學(xué)習(xí)%s.' % (self.name, course_name)) # PEP 8要求標(biāo)識(shí)符的名字用全小寫多個(gè)單詞用下劃線連接 # 但是很多程序員和公司更傾向于使用駝峰命名法(駝峰標(biāo)識(shí)) def watch_av(self): if self.age < 18: print('%s只能觀看《熊出沒》.' % self.name) else: print('%s正在觀看島國(guó)愛情動(dòng)作片.' % self.name)

說明:?寫在類中的函數(shù),我們通常稱之為(對(duì)象的)方法,這些方法就是對(duì)象可以接收的消息。

創(chuàng)建和使用對(duì)象

當(dāng)我們定義好一個(gè)類之后,可以通過下面的方式來創(chuàng)建對(duì)象并給對(duì)象發(fā)消息。

def main():# 創(chuàng)建學(xué)生對(duì)象并指定姓名和年齡stu1 = Student('駱昊', 38) # 給對(duì)象發(fā)study消息 stu1.study('Python程序設(shè)計(jì)') # 給對(duì)象發(fā)watch_av消息 stu1.watch_av() stu2 = Student('王大錘', 15) stu2.study('思想品德') stu2.watch_av() if __name__ == '__main__': main()

訪問可見性問題

對(duì)于上面的代碼,有C++、Java、C#等編程經(jīng)驗(yàn)的程序員可能會(huì)問,我們給Student對(duì)象綁定的name和age屬性到底具有怎樣的訪問權(quán)限(也稱為可見性)。因?yàn)樵诤芏嗝嫦驅(qū)ο缶幊陶Z言中,我們通常會(huì)將對(duì)象的屬性設(shè)置為私有的(private)或受保護(hù)的(protected),簡(jiǎn)單的說就是不允許外界訪問,而對(duì)象的方法通常都是公開的(public),因?yàn)楣_的方法就是對(duì)象能夠接受的消息。在Python中,屬性和方法的訪問權(quán)限只有兩種,也就是公開的和私有的,如果希望屬性是私有的,在給屬性命名時(shí)可以用兩個(gè)下劃線作為開頭,下面的代碼可以驗(yàn)證這一點(diǎn)。

class Test:def __init__(self, foo): self.__foo = foo def __bar(self): print(self.__foo) print('__bar') def main(): test = Test('hello') # AttributeError: 'Test' object has no attribute '__bar' test.__bar() # AttributeError: 'Test' object has no attribute '__foo' print(test.__foo) if __name__ == "__main__": main()

但是,Python并沒有從語法上嚴(yán)格保證私有屬性或方法的私密性,它只是給私有的屬性和方法換了一個(gè)名字來“妨礙”對(duì)它們的訪問,事實(shí)上如果你知道更換名字的規(guī)則仍然可以訪問到它們,下面的代碼就可以驗(yàn)證這一點(diǎn)。之所以這樣設(shè)定,可以用這樣一句名言加以解釋,就是“We are all consenting adults here”。因?yàn)榻^大多數(shù)程序員都認(rèn)為開放比封閉要好,而且程序員要自己為自己的行為負(fù)責(zé)。

class Test:def __init__(self, foo): self.__foo = foo def __bar(self): print(self.__foo) print('__bar') def main(): test = Test('hello') test._Test__bar() print(test._Test__foo) if __name__ == "__main__": main()

在實(shí)際開發(fā)中,我們并不建議將屬性設(shè)置為私有的,因?yàn)檫@會(huì)導(dǎo)致子類無法訪問(后面會(huì)講到)。所以大多數(shù)Python程序員會(huì)遵循一種命名慣例就是讓屬性名以單下劃線開頭來表示屬性是受保護(hù)的,本類之外的代碼在訪問這樣的屬性時(shí)應(yīng)該要保持慎重。這種做法并不是語法上的規(guī)則,單下劃線開頭的屬性和方法外界仍然是可以訪問的,所以更多的時(shí)候它是一種暗示或隱喻,關(guān)于這一點(diǎn)可以看看我的《Python - 那些年我們踩過的那些坑》文章中的講解。

面向?qū)ο蟮闹е?/h3>

面向?qū)ο笥腥笾е?#xff1a;封裝、繼承和多態(tài)。后面兩個(gè)概念在下一個(gè)章節(jié)中進(jìn)行詳細(xì)的說明,這里我們先說一下什么是封裝。我自己對(duì)封裝的理解是“隱藏一切可以隱藏的實(shí)現(xiàn)細(xì)節(jié),只向外界暴露(提供)簡(jiǎn)單的編程接口”。我們?cè)陬愔卸x的方法其實(shí)就是把數(shù)據(jù)和對(duì)數(shù)據(jù)的操作封裝起來了,在我們創(chuàng)建了對(duì)象之后,只需要給對(duì)象發(fā)送一個(gè)消息(調(diào)用方法)就可以執(zhí)行方法中的代碼,也就是說我們只需要知道方法的名字和傳入的參數(shù)(方法的外部視圖),而不需要知道方法內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)(方法的內(nèi)部視圖)。

練習(xí)

練習(xí)1:定義一個(gè)類描述數(shù)字時(shí)鐘

class Clock(object):"""數(shù)字時(shí)鐘""" def __init__(self, hour=0, minute=0, second=0): """初始化方法 :param hour: 時(shí) :param minute: 分 :param second: 秒 """ self._hour = hour self._minute = minute self._second = second def run(self): """走字""" self._second += 1 if self._second == 60: self._second = 0 self._minute += 1 if self._minute == 60: self._minute = 0 self._hour += 1 if self._hour == 24: self._hour = 0 def show(self): """顯示時(shí)間""" return '%02d:%02d:%02d' % \ (self._hour, self._minute, self._second) def main(): clock = Clock(23, 59, 58) while True: print(clock.show()) sleep(1) clock.run() if __name__ == '__main__': main()

練習(xí)2:定義一個(gè)類描述平面上的點(diǎn)并提供移動(dòng)點(diǎn)和計(jì)算到另一個(gè)點(diǎn)距離的方法。

from math import sqrtclass Point(object):def __init__(self, x=0, y=0): """初始化方法 :param x: 橫坐標(biāo) :param y: 縱坐標(biāo) """ self.x = x self.y = y def move_to(self, x, y): """移動(dòng)到指定位置 :param x: 新的橫坐標(biāo) "param y: 新的縱坐標(biāo) """ self.x = x self.y = y def move_by(self, dx, dy): """移動(dòng)指定的增量 :param dx: 橫坐標(biāo)的增量 "param dy: 縱坐標(biāo)的增量 """ self.x += dx self.y += dy def distance_to(self, other): """計(jì)算與另一個(gè)點(diǎn)的距離 :param other: 另一個(gè)點(diǎn) """ dx = self.x - other.x dy = self.y - other.y return sqrt(dx ** 2 + dy ** 2) def __str__(self): return '(%s, %s)' % (str(self.x), str(self.y)) def main(): p1 = Point(3, 5) p2 = Point() print(p1) print(p2) p2.move_by(-1, 2) print(p2) print(p1.distance_to(p2)) if __name__ == '__main__': main()

說明:?本章中的插圖來自于Grady Booch等著作的《面向?qū)ο蠓治雠c設(shè)計(jì)》一書,該書是講解面向?qū)ο缶幊痰慕?jīng)典著作,有興趣的讀者可以購(gòu)買和閱讀這本書來了解更多的面向?qū)ο蟮南嚓P(guān)知識(shí)。

轉(zhuǎn)載于:https://www.cnblogs.com/cherry-tang/p/10974868.html

總結(jié)

以上是生活随笔為你收集整理的Python学习教程(Python学习路线):Day08-面向对象编程基础的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 秋霞三区| 第四色成人网 | 日韩伦理一区二区三区 | 国产精品成人一区二区网站软件 | 色网站在线 | 96精品 | 国产天天操 | 日本免费在线视频 | 毛片视频网站 | 成人欧美在线观看 | 国产乱人对白 | 免费日韩| 伊人精品在线视频 | 欧美日韩亚洲免费 | 女人脱裤子让男人捅 | 波多野结衣在线视频免费观看 | 亚洲乱码一区二区 | 日本精品久久久久 | 国产美女精品视频 | 亚洲一区二区观看播放 | 亚洲乱人伦 | 国产精品入口麻豆 | 一区二区在线免费观看视频 | 午夜久久精品 | 熟妇熟女乱妇乱女网站 | 一区二区日本视频 | 97免费在线观看 | 日日不卡av| 无限国产资源 | 日本做爰高潮又黄又爽 | 久久黄色视 | 国产香蕉视频在线播放 | 久草视频中文在线 | 国产精品性爱在线 | 男女做爰猛烈高潮描写 | 波多野结衣一区二区三区 | 秋霞影院午夜老牛影院 | 毛片链接 | 成人福利一区 | 国产一区久久久 | 欧美特黄 | 夜夜天天 | www四虎影院 | 精品国产一二三 | 玖玖爱资源站 | 999久久久 | 欧美国产精品 | 国内自拍偷拍 | 狠狠操一区 | 美女涩涩视频 | 懂色一区二区三区免费观看 | 色www国产亚洲阿娇 自拍一区在线 | √天堂 | 亚洲日本在线观看视频 | 影音先锋在线观看视频 | 成人免费视频观看 | 在线免费观看av网址 | 久久久久九九 | 国产乱子伦精品视频 | 日韩欧美久久精品 | 人人爽人人射 | 欧美日韩精品亚洲精品 | 91丝袜呻吟高潮美腿白嫩在线观看 | 黄视频在线 | 五月婷婷久久久 | 久久久夜色精品亚洲 | 少妇搡bbbb搡bbb搡打电话 | 日韩av在线免费观看 | 日韩精品一区二区三区视频 | 男女羞羞无遮挡 | 床上激情网站 | 国产主播av在线 | 国产一区二区久久精品 | 亚洲天堂va | 日本久久视频 | www久久99| 午夜黄色大片 | 亚洲成人999| 波多野av在线 | 91视频一区 | 欧美性插视频 | 国产伦理片在线观看 | av大片网址| 99热热 | 欧美性受xxxx黑人xyx性 | 一级理论片 | 中国大陆毛片 | 凹凸精品一区二区三区 | 国产精品97| 天天做天天爽 | 久久精品视频无码 | 亚洲欧美日韩精品久久 | 国产欧美日韩专区 | 特一级黄色大片 | 欧美成人dvd在线视频 | 三级在线看中文字幕完整版 | 成人免费视频国产 | 国产精品亚洲综合 | 国产乱码精品 |