ad09只在一定范圍內查找相似對象_23、面向對象編程

目錄:

  • 對象的概念
  • 類與對象
  • 面向對象編程
    • 類的定義與實例化
    • 屬性訪問
      • 類屬性與對象屬性
      • 屬性查找順序與綁定方法
      • 小結
  • 視頻鏈接

一 對象的概念

68ca40764fbe79d6ad65c6f859e3715d.png

”面向對象“的核心是“對象”二字,而對象的精髓在于“整合“,什么意思?

ec1df3c5edaff3b8dc1442e8e5256b42.png

所有的程序都是由”數據”與“功能“組成,因而編寫程序的本質就是定義出一系列的數據,然后定義出一系列的功能來對數據進行操作。在學習”對象“之前,程序中的數據與功能是分離開的,如下

# 數據:name、age、sex
name='lili'
age=18
sex='female'# 功能:tell_info
def tell_info(name,age,sex): print('<%s:%s:%s>' %(name,age,sex))# 此時若想執行查看個人信息的功能,需要同時拿來兩樣東西,一類是功能tell_info,另外一類則是多個數據name、age、sex,然后才能執行,非常麻煩
tell_info(name,age,sex)

在學習了“對象”之后,我們就有了一個容器,該容器可以盛放數據與功能,所以我們可以說:對象是把數據與功能整合到一起的產物,或者說”對象“就是一個盛放數據與功能的容器/箱子/盒子。

如果把”數據“比喻為”睫毛膏“、”眼影“、”唇彩“等化妝所需要的原材料;把”功能“比喻為眼線筆、眉筆等化妝所需要的工具,那么”對象“就是一個彩妝盒,彩妝盒可以把”原材料“與”工具“都裝到一起

f4174709a5dff895552daf5974b5cfbe.png

如果我們把”化妝“比喻為要執行的業務邏輯,此時只需要拿來一樣東西即可,那就是彩妝盒,因為彩妝盒里整合了化妝所需的所有原材料與功能,這比起你分別拿來原材料與功能才能執行,要方便的多。

2614f5999f45318e7ec747209a684238.png

? 在了解了對象的基本概念之后,理解面向對象的編程方式就相對簡單很多了,面向對象編程就是要造出一個個的對象,把原本分散開的相關數據與功能整合到一個個的對象里,這么做既方便使用,也可以提高程序的解耦合程度,進而提升了程序的可擴展性(需要強調的是,軟件質量屬性包含很多方面,面向對象解決的僅僅只是擴展性問題)

d8bff539f702e681cc21e80125ab95bd.png

二 類與對象

類即類別/種類,是面向對象分析和設計的基石,如果多個對象有相似的數據與功能,那么該多個對象就屬于同一種類。有了類的好處是:我們可以把同一類對象相同的數據與功能存放到類里,而無需每個對象都重復存一份,這樣每個對象里只需存自己獨有的數據即可,極大地節省了空間。所以,如果說對象是用來存放數據與功能的容器,那么類則是用來存放多個對象相同的數據與功能的容器。

044bcc985acad7275eee75b702fb6ec7.png

? 綜上所述,雖然我們是先介紹對象后介紹類,但是需要強調的是:在程序中,必須要事先定義類,然后再調用類產生對象(調用類拿到的返回值就是對象)。產生對象的類與對象之間存在關聯,這種關聯指的是:對象可以訪問到類中共有的數據與功能,所以類中的內容仍然是屬于對象的,類只不過是一種節省空間、減少代碼冗余的機制,面向對象編程最終的核心仍然是去使用對象。

? 在了解了類與對象這兩大核心概念之后,我們就可以來介紹一下面向對象編程啦。

1e7c262e6bf7a12209711578e8b684e6.png

三 面向對象編程

3.1 類的定義與實例化

我們以開發一個清華大學的選課系統為例,來簡單介紹基于面向對象的思想如何編寫程序

f80456cf8ea9220bac8487f3ac7a8dd3.png

面向對象的基本思路就是把程序中要用到的、相關聯的數據與功能整合到對象里,然后再去使用,但程序中要用到的數據以及功能那么多,如何找到相關連的呢?我需要先提取選課系統里的角色:學生、老師、課程等,然后顯而易見的是:學生有學生相關的數據于功能,老師有老師相關的數據與功能,我們單以學生為例,

# 學生的數據有
學校
名字
年齡
性別# 學生的功能有
選課

詳細的

# 學生1:數據:學校=清華大學姓名=李建剛性別=男年齡=28功能:選課# 學生2:數據:學校=清華大學姓名=王大力性別=女年齡=18功能:選課# 學生3:數據:學校=清華大學姓名=牛嗷嗷性別=男年齡=38功能:選課

我們可以總結出一個學生類,用來存放學生們相同的數據與功能

# 學生類相同的特征:學校=清華大學相同的功能:選課

760da8b2b4d8349e483de9e066aa4bd0.png

基于上述分析的結果,我們接下來需要做的就是在程序中定義出類,然后調用類產生對象

class Student: # 類的命名應該使用“駝峰體”school='清華大學' # 數據def choose(self): # 功能print('%s is choosing a course' %self.name)

類體最常見的是變量的定義和函數的定義,但其實類體可以包含任意Python代碼,類體的代碼在類定義階段就會執行,因而會產生新的名稱空間用來存放類中定義的名字,可以打印Student.__dict__來查看類這個容器內盛放的東西

>>> print(Student.__dict__)
{..., 'school': '清華大學', 'choose': <function Student.choose at 0x1018a2950>, ...}

9402511f6fe5ad3a0fd00971c8d2d85b.png

調用類的過程稱為將類實例化,拿到的返回值就是程序中的對象,或稱為一個實例

>>> stu1=Student() # 每實例化一次Student類就得到一個學生對象
>>> stu2=Student()
>>> stu3=Student()

如此stu1、stu2、stu3全都一樣了(只有類中共有的內容,而沒有各自獨有的數據),想在實例化的過程中就為三位學生定制各自獨有的數據:姓名,性別,年齡,需要我們在類內部新增一個__init__方法,如下

class Student:school='清華大學'#該方法會在對象產生之后自動執行,專門為對象進行初始化操作,可以有任意代碼,但一定不能返回非None的值def __init__(self,name,sex,age):self.name=nameself.sex=sexself.age=agedef choose(self): print('%s is choosing a course' %self.name)

然后我們重新實例出三位學生

>>> stu1=Student('李建剛','男',28)
>>> stu2=Student('王大力','女',18)
>>> stu3=Student('牛嗷嗷','男',38)

單拿stu1的產生過程來分析,調用類會先產生一個空對象stu1,然后將stu1連同調用類時括號內的參數一起傳給Student.__init__(stu1,’李建剛’,’男’,28)

def __init__(self, name, sex, age):self.name = name  # stu1.name = '李建剛'self.sex = sex    # stu1.sex = '男'self.age = age    # stu1.age = 28

會產生對象的名稱空間,同樣可以用__dict__查看

>>> stu1.__dict__
{'name': '李建剛', 'sex': '男', 'age': 28}

ffb6b6a21178e3a1f5507087204016aa.png

至此,我們造出了三個對象與一個類,對象存放各自獨有的數據,類中存放對象們共有的內容

374bf6bde7fc80db4fea08980690be40.png

9efe96417f6d888941859c5eeab93b4f.png

存的目的是為了用,那么如何訪問對象或者類中存放的內容呢?

62b65e4d85d43f2327bf0131a79d8007.png

3.2 屬性訪問

3.2.1 類屬性與對象屬性

7fe9b8bc34cb796df8b83a8b492ae76a.png

在類中定義的名字,都是類的屬性,細說的話,類有兩種屬性:數據屬性和函數屬性,可以通過__dict__訪問屬性的值,比如Student.__dict__[‘school’],但Python提供了專門的屬性訪問語法

插圖:惡搞圖

>>> Student.school # 訪問數據屬性,等同于Student.__dict__['school']
'清華大學'
>>> Student.choose # 訪問函數屬性,等同于Student.__dict__['choose']
<function Student.choose at 0x1018a2950>
# 除了查看屬性外,我們還可以使用Student.attrib=value(修改或新增屬性),用del Student.attrib刪除屬性。

操作對象的屬性也是一樣

>>> stu1.name # 查看,等同于obj1.__dict__[‘name']
'李建剛'
>>> stu1.course=’python’ # 新增,等同于obj1.__dict__[‘course']='python'
>>> stu1.age=38 # 修改,等同于obj1.__dict__[‘age']=38
>>> del obj1.course # 刪除,等同于del obj1.__dict__['course']

9efe96417f6d888941859c5eeab93b4f.png

3.2.2 屬性查找順序與綁定方法

對象的名稱空間里只存放著對象獨有的屬性,而對象們相似的屬性是存放于類中的。對象在訪問屬性時,會優先從對象本身的__dict__中查找,未找到,則去類的__dict__中查找

62b65e4d85d43f2327bf0131a79d8007.png

1、類中定義的變量是類的數據屬性,是共享給所有對象用的,指向相同的內存地址

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

4337805126aaeb26f73802845ea900bc.png

4f58e786d0fa9d9e0edbdf001991f3bd.png

2、類中定義的函數是類的函數屬性,類可以使用,但必須遵循函數的參數規則,有幾個參數需要傳幾個參數

Student.choose(stu1) # 李建剛 is choosing a course
Student.choose(stu2) # 王大力 is choosing a course
Student.choose(stu3) # 牛嗷嗷 is choosing a course

但其實類中定義的函數主要是給對象使用的,而且是綁定給對象的,雖然所有對象指向的都是相同的功能,但是綁定到不同的對象就是不同的綁定方法,內存地址各不相同

print(id(Student.choose)) # 4335426280print(id(stu1.choose)) # 4300433608
print(id(stu2.choose)) # 4300433608
print(id(stu3.choose)) # 4300433608

綁定到對象的方法特殊之處在于,綁定給誰就應該由誰來調用,誰來調用,就會將’誰’本身當做第一個參數自動傳入(方法__init__也是一樣的道理)

stu1.choose()  # 等同于Student.choose(stu1)
stu2.choose()  # 等同于Student.choose(stu2)
stu3.choose()  # 等同于Student.choose(stu3)

綁定到不同對象的choose技能,雖然都是選課,但李建剛選的課,不會選給王大力,這正是”綁定“二字的精髓所在。

#注意:綁定到對象方法的這種自動傳值的特征,決定了在類中定義的函數都要默認寫一個參數self,self可以是任意名字,但命名為self是約定俗成的。

e2023b90890a4f639c899e2d6376d156.png

Python中一切皆為對象,且Python3中類與類型是一個概念,因而綁定方法我們早就接觸過

#類型list就是類
>>> list
<class 'list'>#實例化的到3個對象l1,l2,l3
>>> l1=list([1,2,3])
>>> l2=list(['a','b','c'])
>>> l3=list(['x','y'])#三個對象都有綁定方法append,是相同的功能,但內存地址不同
>>> l1.append
<built-in method append of list object at 0x10b482b48>
>>> l2.append
<built-in method append of list object at 0x10b482b88>
>>> l3.append
<built-in method append of list object at 0x10b482bc8>#操作綁定方法l1.append(4),就是在往l1添加4,絕對不會將4添加到l2或l3
>>> l1.append(4) #等同于list.append(l1,4)
>>> l1
[1,2,3,4]
>>> l2
['a','b','c']
>>> l3
['x','y']

4337805126aaeb26f73802845ea900bc.png

3.3.3 小結

在上述介紹類與對象的使用過程中,我們更多的是站在底層原理的角度去介紹類與對象之間的關聯關系,如果只是站在使用的角度,我們無需考慮語法“對象.屬性"中”屬性“到底源自于哪里,只需要知道是通過對象獲取到的就可以了,所以說,對象是一個高度整合的產物,有了對象,我們只需要使用”對象.xxx“的語法就可以得到跟這個對象相關的所有數據與功能,十分方便且解耦合程度極高。

62b65e4d85d43f2327bf0131a79d8007.png

b8b1b30488ab30affa36bbf03cfc62ac.png

視頻鏈接:

python快速入門(一)_嗶哩嗶哩 (゜-゜)つロ 干杯~-bilibili?www.bilibili.com
85515560bf7b1078778051d9cf1e25f9.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386008.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386008.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386008.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java開發工程師轉行可以做什么

前言 分布式事務主要解決分布式一致性的問題。說到底就是數據的分布式操作導致僅依靠本地事務無法保證原子性。與單機版的事務不同的是&#xff0c;單機是把多個命令打包成一個統一處理&#xff0c;分布式事務是將多個機器上執行的命令打包成一個命令統一處理。 MySQL 提供了…

atlas怎么看日志_億級的日志治理!微服務最佳方案,ELK stack從零搭建

ELK Stack 誕生背景一般我們需要進行日志分析場景&#xff1a;直接在日志文件中 grep、awk 就可以獲得自己想要的信息。但在規模較大的場景中&#xff0c;此方法效率低下&#xff0c;面臨問題包括日志量太大如何歸檔、文本搜索太慢怎么辦、如何多維度查詢。需要集中化的日志管理…

Java變量類型

所有的變量在使用前必須聲明。 type identifier [ value][, identifier [ value] ...] ; 格式說明&#xff1a;type是數據類型&#xff0c;identifier是變量名&#xff0c;可以使用逗號隔開來聲明多個同類型變量。 一下列出一些變量的聲明實例&#xff0c;有些包含了初始化過…

java開發工程師面試問題大全及答案大全

前言 Alibaba作為國內互聯網行業的“老大”&#xff0c;一直以來也是很多“數碼寶貝”夢寐以求的公司&#xff0c;我個人是做Java開發的&#xff0c;阿里這些年也開發了很多屌炸天的開源項目&#xff0c;像什么Spring Cloud Alibaba&#xff0c;開源Java診斷工具Arthas&#x…

me shy是什么歌 抖音make_內含活動福利 | 小紅書、抖音爆贊的高顏值的北歐家居神店開到卜蜂中心啦!...

幾個月前&#xff0c;一家北歐范顏值爆表的瑞典獨立設計師品牌家居店憑借其充滿設計感的產品刷爆社交媒體微博、小紅書、抖音經常出現它的身影隨便一篇閱讀量、收藏量都好幾萬數不清的爆like讓人按耐不住了&#xff01;這個品牌叫NǒME家居(認住這個正版的ǒ)&#xff0c;開到哪…

java開發工程師面試題及答案

前言 作為一名編程人員&#xff0c;對MySQL一定不會陌生&#xff0c;尤其是互聯網行業&#xff0c;對MySQL的使用是比較多的。對于求職者來說&#xff0c;MySQL又是面試中一定會問到的重點&#xff0c;很多人擁有大廠夢&#xff0c;卻因為MySQL敗下陣來。實際上&#xff0c;My…

呂玉琴考研指導電子版_【干貨大放送】中國歷代文學作品選閱讀指導PDF

跟緊我&#xff0c;來年輕松收獲錄取通知書~長按一戰成碩hello&#xff0c;我是小致帶你考研上路今天給大家分享的干貨內容是《歷代文學作品選》閱讀指導之前1000題濃縮資料&#xff0c;后臺回復【濃縮】獲取不要再留郵箱了&#xff0c;直接后臺獲取本次資料由致遠文學考研原創…

java開發工程師面試題總結

一、背景 我們日常在電商網站購物時經常會遇到一些高并發的場景&#xff0c;例如電商 App 上經常出現的秒殺活動、限量優惠券搶購&#xff0c;還有我們去哪兒網的火車票搶票系統等&#xff0c;這些場景有一個共同特點就是訪問量激增&#xff0c;雖然在系統設計時會通過限流、異…

Java重寫和重載

重寫&#xff08;Override&#xff09; 重寫是子類重寫父類的方法&#xff0c;如果重寫了父類的方法&#xff0c;訪問時父類的方法就會被覆蓋&#xff0c;如果想要再訪問父類的同名方法&#xff0c;要用super關鍵字。重寫的好處在于子類可以根據自己的需要&#xff0c;定義特定…

7天拿到阿里Android崗位offer,都是精髓!

食用指南 和大部分人一樣&#xff0c;我在復習完第一遍Android知識的情況下&#xff0c;看到相關的知識回答的仍然不能夠令自己滿意。 在第二遍系統復習的時候&#xff0c;我著重記住每個知識點的關鍵字&#xff0c;根據這些關鍵字拼湊出大概的知識點&#xff0c;最后看到每個…

kafka 重新分配節點_Kafka控制器-分區重分配

分區重分配指的是將分區的副本重新分配到不同的代理節點上。如果ZK節點中分區的副本的新副本集合和當前分區副本集合相同&#xff0c;這個分區就不需要重新分配了。分區重分配是通過監聽ZK的 /admin/reassign_partitions 節點觸發的&#xff0c;Kafka也提供了相應的腳本工具進行…

7天拿到阿里安卓崗位offer,統統給你解決!

開頭 技術的發展產生了程序員這個職位&#xff0c;從這些年各大互聯網公司曝光的一些員工收入水平來看&#xff0c;程序員的工資還是相對比較高的&#xff0c;可是我們在互聯網上還聽到了另外一種聲音&#xff0c;很多程序員想轉行&#xff0c;特別是大齡程序員&#xff0c;這…

python mysqldb 查詢不到最新記錄_python – MySQLdb是否緩存SELECT結果?

我正在循環中運行SELECT查詢.偶爾,數據庫表會更新(由另一個程序).第一個SELECT檢索正確的數據,但循環中的其他調用返回第一個值.如何檢索最新數據&#xff1f;到目前為止我找到的唯一解決方法是在每次迭代時重新連接到數據庫&#xff01;在我的例子中,取消注釋#1#和#2#的注釋.僅…

7天拿到阿里安卓崗位offer,附高頻面試題合集

前言 眾所周知&#xff0c;Android是一個基于Linux實現的操作系統。但對于Linux內核來說&#xff0c;Android也僅僅只是一個運行在內核之上的應用程序&#xff0c;與其他運行在內核之上的應用程序沒有任何區別。 所以Android也需要運行環境&#xff0c;需要Linux內核在啟動完…

找零錢問題

最近在做華為機試體驗題&#xff0c;遇到一個“找零錢”的題目&#xff0c;如下 想起之前在牛客網上看到左程云老師講過的動態規劃問題&#xff0c;很像&#xff0c;題目如下&#xff1a; 有數組penny&#xff0c;penny中所有的值都為正數且不重復。每個值代表一種面值的貨幣&…

vga焊接線順序_焊接工藝問答,不做焊接也要收藏起來

點 機械前沿”關注置頂引領機械前沿、機械視頻&#xff0c;汽車、加工技術、3D打印、自動化、機器人、生產工藝、軸承、模具、機床、鈑金等行業前沿在這里等你 焊接工藝問答1.什么叫焊接條件&#xff1f;它有哪些內容&#xff1f;?答&#xff1a;焊…

7年老Android一次操蛋的面試經歷,揮淚整理面經

看到還有很多程序員連面試流程都沒有徹底弄清楚&#xff0c;今天&#xff0c;我們以阿里為例&#xff0c;來聊聊互聯網大廠的面試流程和過程&#xff01; 本篇主要還是聊聊社招的面試過程&#xff01;阿里以及其他的互聯網大廠的技術類社招面試&#xff0c;通常情況是 4 個輪次…

gin context和官方context_Go Web 小技巧(一)簡化Gin接口代碼

不知道大家在使用 Gin 構建 API 服務時有沒有這樣的問題:參數綁定的環節可不可以自動處理&#xff1f;錯誤可不可以直接返回&#xff0c;不想寫空 return, 漏寫就是 bug本文通過簡單地封裝&#xff0c;利用 go 的接口特性&#xff0c;提供一個解決上述兩個問題的思路一、解決過…

7年老Android一次操蛋的面試經歷,深度好文

Java基礎 Java Object類方法HashMap原理&#xff0c;Hash沖突&#xff0c;并發集合&#xff0c;線程安全集合及實現原理HashMap 和 HashTable 區別HashCode 作用&#xff0c;如何重載hashCode方法ArrayList與LinkList區別與聯系GC機制Java反射機制&#xff0c;Java代理模式Jav…

Hadoop大數據應用生態圈中最主要的組件及其關系

Hadoop Common Hadoop Common是在Hadoop0.2版本之后分離出來的HDFS和MapReduce獨立子項目的內容&#xff0c;是Hadoop的核心部分&#xff0c;能為其他模塊提供一些常用工具集&#xff0c;如序列化機制、Hadoop抽象文件系統FileSystem、系統配置工具Configuration&#xff0c;并…