09-01 面向?qū)ο缶幊?/h1>

目錄

  • 一 對象的概念
  • 二 類與對象
  • 三 面向?qū)ο缶幊?/strong>
    • 3.1 類的定義與實(shí)例化
    • 3.2 屬性訪問
      • 3.2.1 類屬性與對象屬性
      • 3.2.2 屬性查找順序與綁定方法
      • 3.3.3 小結(jié)
  • 四 視頻鏈接

一 對象的概念

”面向?qū)ο蟆暗暮诵氖恰皩ο蟆倍郑鴮ο蟮木柙谟凇罢稀埃裁匆馑迹?/p>

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

# 數(shù)據(jù):name、age顽素、sex
name='lili'
age=18
sex='female'

# 功能:tell_info
def tell_info(name,age,sex): 
    print('<%s:%s:%s>' %(name,age,sex))

# 此時(shí)若想執(zhí)行查看個(gè)人信息的功能,需要同時(shí)拿來兩樣?xùn)|西徒蟆,一類是功能tell_info胁出,另外一類則是多個(gè)數(shù)據(jù)name、age段审、sex划鸽,然后才能執(zhí)行,非常麻煩
tell_info(name,age,sex)

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

如果把”數(shù)據(jù)“比喻為”睫毛膏“嘱函、”眼影“甘畅、”唇彩“等化妝所需要的原材料;把”功能“比喻為眼線筆、眉筆等化妝所需要的工具疏唾,那么”對象“就是一個(gè)彩妝盒蓄氧,彩妝盒可以把”原材料“與”工具“都裝到一起

如果我們把”化妝“比喻為要執(zhí)行的業(yè)務(wù)邏輯,此時(shí)只需要拿來一樣?xùn)|西即可槐脏,那就是彩妝盒喉童,因?yàn)椴蕣y盒里整合了化妝所需的所有原材料與功能,這比起你分別拿來原材料與功能才能執(zhí)行顿天,要方便的多堂氯。

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

二 類與對象

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

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

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

三 面向?qū)ο缶幊?/h1>

3.1 類的定義與實(shí)例化

我們以開發(fā)一個(gè)清華大學(xué)的選課系統(tǒng)為例,來簡單介紹基于面向?qū)ο蟮乃枷肴绾尉帉懗绦?/p>

面向?qū)ο蟮幕舅悸肪褪前殉绦蛑幸玫降南峋⑾嚓P(guān)聯(lián)的數(shù)據(jù)與功能整合到對象里契沫,然后再去使用,但程序中要用到的數(shù)據(jù)以及功能那么多昔汉,如何找到相關(guān)連的呢懈万?我需要先提取選課系統(tǒng)里的角色:學(xué)生、老師挤庇、課程等钞速,然后顯而易見的是:學(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é)出一個(gè)學(xué)生類,用來存放學(xué)生們相同的數(shù)據(jù)與功能

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

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

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

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

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

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

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

調(diào)用類的過程稱為將類實(shí)例化泻轰,拿到的返回值就是程序中的對象技肩,或稱為一個(gè)實(shí)例

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

如此stu1、stu2浮声、stu3全都一樣了(只有類中共有的內(nèi)容虚婿,而沒有各自獨(dú)有的數(shù)據(jù)),想在實(shí)例化的過程中就為三位學(xué)生定制各自獨(dú)有的數(shù)據(jù):姓名泳挥,性別然痊,年齡,需要我們在類內(nèi)部新增一個(gè)__init__方法,如下

class Student:
    school='清華大學(xué)'
    
    #該方法會在對象產(chǎn)生之后自動(dòng)執(zhí)行屉符,專門為對象進(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é)生

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

單拿stu1的產(chǎn)生過程來分析矗钟,調(diào)用類會先產(chǎn)生一個(gè)空對象stu1唆香,然后將stu1連同調(diào)用類時(shí)括號內(nèi)的參數(shù)一起傳給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

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

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

至此吨艇,我們造出了三個(gè)對象與一個(gè)類躬它,對象存放各自獨(dú)有的數(shù)據(jù),類中存放對象們共有的內(nèi)容

存的目的是為了用秸应,那么如何訪問對象或者類中存放的內(nèi)容呢虑凛?

3.2 屬性訪問

3.2.1 類屬性與對象屬性

在類中定義的名字,都是類的屬性软啼,細(xì)說的話桑谍,類有兩種屬性:數(shù)據(jù)屬性和函數(shù)屬性,可以通過__dict__訪問屬性的值祸挪,比如Student.__dict__[‘school’]锣披,但Python提供了專門的屬性訪問語法

>>> Student.school # 訪問數(shù)據(jù)屬性,等同于Student.__dict__['school']
'清華大學(xué)'
>>> Student.choose # 訪問函數(shù)屬性贿条,等同于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__[‘a(chǎn)ge']=38
>>> del obj1.course # 刪除公黑,等同于del obj1.__dict__['course']

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

對象的名稱空間里只存放著對象獨(dú)有的屬性邑商,而對象們相似的屬性是存放于類中的。對象在訪問屬性時(shí)凡蚜,會優(yōu)先從對象本身的__dict__中查找人断,未找到,則去類的__dict__中查找

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

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

print(id(stu1.school)) # 4301108704
print(id(stu2.school)) # 4301108704
print(id(stu3.school)) # 4301108704

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

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

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

print(id(Student.choose)) # 4335426280

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

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

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

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

#注意:綁定到對象方法的這種自動(dòng)傳值的特征嗜暴,決定了在類中定義的函數(shù)都要默認(rèn)寫一個(gè)參數(shù)self凸克,self可以是任意名字,但命名為self是約定俗成的闷沥。

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

#類型list就是類
>>> list
<class 'list'>

#實(shí)例化的到3個(gè)對象l1,l2,l3
>>> l1=list([1,2,3])
>>> l2=list(['a','b','c'])
>>> l3=list(['x','y'])

#三個(gè)對象都有綁定方法append,是相同的功能,但內(nèi)存地址不同
>>> 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']

3.3.3 小結(jié)

在上述介紹類與對象的使用過程中舆逃,我們更多的是站在底層原理的角度去介紹類與對象之間的關(guān)聯(lián)關(guān)系蚂维,如果只是站在使用的角度,我們無需考慮語法“對象.屬性"中”屬性“到底源自于哪里路狮,只需要知道是通過對象獲取到的就可以了虫啥,所以說,對象是一個(gè)高度整合的產(chǎn)物奄妨,有了對象涂籽,我們只需要使用”對象.xxx“的語法就可以得到跟這個(gè)對象相關(guān)的所有數(shù)據(jù)與功能,十分方便且解耦合程度極高展蒂。

加qq群830644110獲取更多高級文章&項(xiàng)目源代碼

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者

  • 序言:七十年代末又活,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子锰悼,更是在濱河造成了極大的恐慌柳骄,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件箕般,死亡現(xiàn)場離奇詭異耐薯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)丝里,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門曲初,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人杯聚,你說我怎么就攤上這事臼婆。” “怎么了幌绍?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵颁褂,是天一觀的道長。 經(jīng)常有香客問我傀广,道長颁独,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任伪冰,我火速辦了婚禮誓酒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贮聂。我一直安慰自己靠柑,他們只是感情好寨辩,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著歼冰,像睡著了一般捣染。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上停巷,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天,我揣著相機(jī)與錄音榕栏,去河邊找鬼畔勤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛扒磁,可吹牛的內(nèi)容都是我干的庆揪。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼妨托,長吁一口氣:“原來是場噩夢啊……” “哼缸榛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起兰伤,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤内颗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后敦腔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體均澳,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年符衔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了找前。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,747評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡判族,死狀恐怖躺盛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情形帮,我是刑警寧澤槽惫,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站沃缘,受9級特大地震影響躯枢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜槐臀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一锄蹂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧水慨,春花似錦得糜、人聲如沸敬扛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啥箭。三九已至,卻和暖如春治宣,著一層夾襖步出監(jiān)牢的瞬間急侥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工侮邀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坏怪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓绊茧,卻偏偏與公主長得像铝宵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子华畏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容