學(xué)習(xí)編程的過程中溪烤,漸漸的罚攀,我們就會(huì)遇到一些更復(fù)雜抽象的概念。
比如兽狭,面向?qū)ο蟮木幊蹋∣bject-oriented programming)萧朝。這是目前主流的編程思想岔留,或者編程方法之一夏哭。
面向?qū)ο蟮母拍罴旒恚畛跏窃?950s~1960s年代的MIT(麻省理工學(xué)院)提出的,用于人工智能和圖形交互界面。
舉一個(gè)簡(jiǎn)單的例子何址,我們要做一個(gè)猜動(dòng)物的小游戲:
涉及三類動(dòng)物里逆,哺乳動(dòng)物、鳥類用爪、爬行動(dòng)物原押,每一類有幾種動(dòng)物的例子,比如馬偎血、貓诸衔、大象、蝙蝠颇玷、鴨嘴獸笨农、鸚鵡、 鵝帖渠、烏龜谒亦、科莫多龍等等。
每一類動(dòng)物具有一些共同的特征空郊,比如有四條腿份招、有翅膀、可以飛行狞甚、通過哺乳喂養(yǎng)幼崽等等……
我們可以將每種動(dòng)物的每一個(gè)特征都詳細(xì)列出來(lái)锁摔,但是這很麻煩,有很多重復(fù)勞動(dòng)哼审;我們也可以先把某一類動(dòng)物的共同特征列出來(lái)鄙漏,指出某種動(dòng)物屬于某一類,然后只要說(shuō)明它獨(dú)特的部分就行了棺蛛。
我們創(chuàng)建一些類怔蚌,描述它們的屬性和方法,還可以創(chuàng)造子類以及子類的子類旁赊,比如哺乳動(dòng)物類桦踊,貓科動(dòng)物子類,家貓子類(我們并沒有使用生物學(xué)上嚴(yán)格的分類方法终畅,只是舉個(gè)例子)籍胯;我們可以創(chuàng)建這些類或子類的對(duì)象,比如小明家的加菲貓……
這種分類創(chuàng)建對(duì)象來(lái)構(gòu)建和組織代碼編程的方法离福,就是面向?qū)ο缶幊塘恕?/p>
因?yàn)檫@符合我們看待世界和解決某些問題的思維方式杖狼,所以這樣編程是有效的,特別是適合圖形交互界面編程妖爷,以及大型的團(tuán)隊(duì)合作編程蝶涩。
說(shuō)到這里,來(lái)看看個(gè)人電腦早期的經(jīng)典APPLE II的圖形界面吧:
順便推薦兩本書:
Scratch中沒有類的概念,但是每個(gè)角色都是一個(gè)對(duì)象绿聘,它們有自己的屬性嗽上,比如位置、大小熄攘、顏色特效等兽愤,可以為每個(gè)角色編寫代碼,讓它們按照我們的設(shè)想行動(dòng)挪圾,與我們交互浅萧,它們之間還可以通過廣播來(lái)發(fā)送和接收消息,我們可以在編輯時(shí)復(fù)制哲思、在程序運(yùn)行時(shí)克隆這些角色(或者說(shuō)對(duì)象)惯殊。這些在之前的例子中都出現(xiàn)了,不舉例了也殖。
或者土思,跳一下去看《007 算法》的例子吧。
Python呢忆嗜,有句話說(shuō)己儒,在Python中,一切皆對(duì)象捆毫。
Python 關(guān)于對(duì)象的例子
編輯文件oop.py:
# 定義哺乳動(dòng)物類
class mammal:
# 哺乳動(dòng)物哺乳
lactation = True
def tell(self):
print("我是哺乳動(dòng)物闪湾!")
# 定義貓科動(dòng)物類(哺乳動(dòng)物的子類)
class felid(mammal):
# 貓科動(dòng)物是肉食的
carnivorous = True
def tell(self):
print("我是貓科動(dòng)物!")
# 定義貓類(貓科動(dòng)物的子類)
class cat(felid):
name = ""
# 貓捕鼠
mouse_hunting = True
def __init__(self, name):
felid.__init__(self)
self.name = name
def tell(self):
print("我是貓绩卤!")
def about(self):
print("我是一只名叫\(zhòng)"%s\"的貓途样!" % (self.name))
運(yùn)行oop.py(每次運(yùn)行id的數(shù)字會(huì)不同,不用管他):
>>> elephant = mammal()
>>> id(elephant)
3102587337528
>>> type(elephant)
<class '__main__.mammal'>
>>> elephant.lactation
True
>>> elephant.tell()
我是哺乳動(dòng)物濒憋!
>>> tiger = felid()
>>> id(tiger)
3102586816328
>>> type(tiger)
<class '__main__.felid'>
>>> tiger.lactation
True
>>> tiger.carnivorous
True
>>> tiger.tell()
我是貓科動(dòng)物何暇!
>>> tom = cat("Tom")
>>> id(tom)
3102587479600
>>> type(tom)
<class '__main__.cat'>
>>> tom.lactation
True
>>> tom.carnivorous
True
>>> tom.mouse_hunting
True
>>> tom.tell()
我是貓!
>>> tom.about()
我是一只名叫"Tom"的貓凛驮!
>>>
python中的對(duì)象都符合三個(gè)特征:
id裆站,可以當(dāng)中機(jī)器中區(qū)分每個(gè)對(duì)象的門牌號(hào)碼,可以用id()這個(gè)方法來(lái)查詢黔夭;
type宏胯,即對(duì)象所屬的類,可以用type()方法來(lái)查詢;
對(duì)象的值本姥,可以說(shuō)是對(duì)象包含的數(shù)據(jù)肩袍。
這些,從上面的例子就可以看到了婚惫。那么氛赐,為什么說(shuō)在Python中一切皆對(duì)象呢魂爪?
來(lái)試試看吧:
>>> a = 123
>>> id(a)
1805024544
>>> type(a)
<class 'int'>
>>> b = "two words"
>>> id(b)
3102587445040
>>> type(b)
<class 'str'>
>>> id(id)
3102548261840
>>> type(id)
<class 'builtin_function_or_method'>
>>> id(type)
1804583984
>>> type(type)
<class 'type'>