在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ exercise42.對(duì)象、類、以及從屬關(guān)系
附錄 A-練習(xí) 9:生成一個(gè)空文件(Touch, New-Item)
附錄 A-練習(xí) 10:復(fù)制文件 (cp)
exercise44.繼承 Vs.包含
附錄 A-練習(xí) 14:刪除文件 (rm)
附錄 A-練習(xí) 11:移動(dòng)文件 (mv)
exercise46.項(xiàng)目骨架
附錄 A-練習(xí) 3:如果你迷路了
exercise37.復(fù)習(xí)符號(hào)
exercise47.自動(dòng)化測(cè)試
exercise3.數(shù)字和數(shù)學(xué)計(jì)算
附錄 A-練習(xí) 1:安裝
exercise32.循環(huán)和列表
exercise31.做出決定
exercise42.對(duì)象、類、以及從屬關(guān)系
exercise48.更復(fù)雜的用戶輸入
下一步
簡(jiǎn)介
附錄 A-練習(xí) 7:刪除路徑 (rmdir)
exercise49.寫代碼語(yǔ)句
exercise18.命名, 變量, 代碼, 函數(shù)
exercise12.提示別人
exercise14.提示和傳遞
exercise40.模塊, 類和對(duì)象
附錄 A-練習(xí) 12:查看文件 (less, MORE)
exercise9.打印, 打印, 打印
exercise13.參數(shù), 解包, 變量
exercise30. Else 和 If
exercise28. 布爾表達(dá)式
附錄 A-練習(xí) 4:創(chuàng)建一個(gè)路徑 (mkdir)
附錄 A-練習(xí) 15:退出命令行 (exit)
exercise25. 更多更多的練習(xí)
exercise6.字符串和文本
exercise2.注釋和井號(hào)“#”
exercise21. 函數(shù)的返回值
附錄 A-下一步
exercise1.第一個(gè)程序
exercise23. 閱讀代碼
附錄 A-練習(xí) 5:改變當(dāng)前路徑 (cd)
exercise17.更多文件操作
exercise24. 更多的練習(xí)
exercise19.函數(shù)和變量
exercise51.從瀏覽器獲取輸入
exercise22. 到目前為止你學(xué)到了什么?
exercise41.學(xué)會(huì)說(shuō)面向?qū)ο?/span>
exercise52.開始你的 web 游戲
exercise20. 函數(shù)和文件
exercise15.讀文件
exercise45.你來(lái)制作一個(gè)游戲
exercise10.那是什么?
exercise8.打印, 打印
exercise35.分支和函數(shù)
exercise26. 恭喜你,可以進(jìn)行一次考試了
exercise33.while 循環(huán)
exercise29. IF 語(yǔ)句
exercise36.設(shè)計(jì)和調(diào)試
exercise0.安裝和準(zhǔn)備
exercise50.你的第一個(gè)網(wǎng)站
附錄 A-練習(xí) 2:路徑, 文件夾, 名錄 (pwd)
exercise38.列表操作
附錄 A-練習(xí) 6:列出當(dāng)前路徑 (ls)
exercise16.讀寫文件
exercise4.變量和命名
exercise34.訪問列表元素
exercise11.提問
exercise43.基本的面向?qū)ο蟮姆治龊驮O(shè)計(jì)
附錄 A-簡(jiǎn)介
附錄 A-練習(xí) 8:目錄切換(pushd, popd)
來(lái)自老程序員的建議
exercise27. 記住邏輯
exercise5.更多的變量和打印
exercise7.更多的打?。ㄝ敵觯?/span>
附錄 A-練習(xí) 13:輸出文件 (cat)
exercise39.字典,可愛的字典

exercise42.對(duì)象、類、以及從屬關(guān)系

有一個(gè)重要的概念你需要弄明白,那就是“類(class)”和“對(duì)象(object)”的區(qū)別。問題在于,class 和 object 并沒有真正的不同。它們其實(shí)是同樣的東西,只是在不同的時(shí)間名字不同罷了。我用禪語(yǔ)來(lái)解釋一下吧:

魚和三文魚有什么區(qū)別?

這個(gè)問題有沒有讓你有點(diǎn)暈?zāi)??說(shuō)真的,坐下來(lái)想一分鐘。我的意思是說(shuō),魚和三文魚是不一樣,不過(guò)它們其實(shí)也是一樣的是不是?三文魚是魚的一種,所以說(shuō)沒什么不同,不過(guò)三文魚又有些特別,它和別的種類的魚的確不一樣,比如三文魚和大比目魚就不一樣。所以三文魚和魚既相同又不同。怪了。

這個(gè)問題讓人暈的原因是大部分人不會(huì)這樣去思考問題,其實(shí)每個(gè)人都懂這一點(diǎn),你無(wú)須去思考魚和三文魚的區(qū)別,因?yàn)槟阒浪鼈冎g的關(guān)系。你知道三文魚是魚的一種,而且魚還有別的種類,根本就沒必要去思考這類問題。

讓我們更進(jìn)一步,假設(shè)你有一只水桶,里邊有三條三文魚。假設(shè)你的好人卡多到?jīng)]地方用,于是你給它們分別取名叫 Frank, Joe,和 Mary?,F(xiàn)在想想這個(gè)問題:

Mary 和三文魚有什么區(qū)別?

這個(gè)問題一樣的奇怪,但比起魚和三文魚的問題來(lái)還好點(diǎn)。你知道 Mary 是一條三文魚,所以他并沒什么不同,他只是三文魚的一個(gè)“實(shí)例(instance)”。Frank 和 Joe 一樣也是三文魚的實(shí)例。我的意思是說(shuō),它們是由三文魚創(chuàng)建出來(lái)的,而且代表著和三文魚一樣的屬性。

所以我們的思維方式是(你可能會(huì)有點(diǎn)不習(xí)慣):魚是一個(gè)“類(class)”,三文魚是一個(gè)“類(class)”,而 Mary 是一個(gè)“對(duì)象(object)”。仔細(xì)想想,然后我再一點(diǎn)一點(diǎn)慢慢解釋給你。

魚是一個(gè)“類”,表示它不是一個(gè)真正的東西,而是一個(gè)用來(lái)描述具有同類屬性的實(shí)例的概括性詞匯。 你有鰭?你有鰾?你住在水里?好吧那你就是一條魚。

后來(lái)河蟹養(yǎng)殖專家路過(guò),看到你的水桶,于是告訴你:“小伙子,你這些魚是三文魚?!?并且專家還定義了一個(gè)新的叫做“三文魚”的“類”,而這個(gè)“類”又有它特定的屬性。長(zhǎng)鼻子?淺紅色的肉?生活在海洋里?吃起來(lái)味道還可以?那你就是一條三文魚。

最后一個(gè)廚師過(guò)來(lái)了,他跟專家說(shuō):“非也非也,你看到的是三文魚,我看到的是 Mary,而且我要把 Mary 和剁椒配一起做一道小菜?!庇谑悄憔陀辛艘恢唤凶?Mary 的三文魚的“實(shí)例(instance)”(三文魚也是魚的一個(gè)“實(shí)例”),并且你使用了它,這樣它就是一個(gè)“對(duì)象(object)”。

這會(huì)你應(yīng)該了解了:Mary 是三文魚的成員,而三文魚又是魚的成員。這里的關(guān)系式:對(duì)象屬于某個(gè)類,而某個(gè)類又屬于另一個(gè)類。

寫成代碼是什么樣子

這個(gè)概念有點(diǎn)繞,不過(guò)實(shí)話說(shuō),你只要在創(chuàng)建和使用 class 的時(shí)候操心一下就可以了。我來(lái)給你兩個(gè)區(qū)分 Class 和 Object 的小技巧。

首先針對(duì)類和對(duì)象,你需要學(xué)會(huì)兩個(gè)說(shuō)法,“is-a(是啥)”和“has-a(有啥)”?!笆巧丁币迷谡?wù)摗皟烧咭灶惖年P(guān)系互相關(guān)聯(lián)”的時(shí)候,而“有啥”要用在“兩者無(wú)共同點(diǎn),僅是互為參照”的時(shí)候。

接下來(lái),通讀這段代碼,將每一個(gè)注釋為##?? 的位置標(biāo)明他是“is-a”還是“has-a”的關(guān)系,并講明白這個(gè)關(guān)系是什么。在代碼的開始我還舉了幾個(gè)例子,所以你只要寫剩下的就可以了。

記住,“是啥”指的是魚和三文魚的關(guān)系,而“有啥”指的是三文魚和鰓的關(guān)系。

## Animal is-a object (yes, sort of confusing) look at the extra credit
class Animal(object):
    pass

## ??
class Dog(Animal):

    def __init__(self, name):
        ## ??
        self.name = name

## ??
class Cat(Animal):

    def __init__(self, name):
        ## ??
        self.name = name

## ??
class Person(object):

    def __init__(self, name):
        ## ??
        self.name = name

        ## Person has-a pet of some kind
        self.pet = None

## ??
class Employee(Person):

    def __init__(self, name, salary):
        ## ?? hmm what is this strange magic?
        super(Employee, self).__init__(name)
        ## ??
        self.salary = salary

## ??
class Fish(object):
    pass

## ??
class Salmon(Fish):
    pass

## ??
class Halibut(Fish):
    pass

## rover is-a Dog
rover = Dog("Rover")

## ??
satan = Cat("Satan")

## ??
mary = Person("Mary")

## ??
mary.pet = satan

## ??
frank = Employee("Frank", 120000)

## ??
frank.pet = rover

## ??
flipper = Fish()

## ??
crouse = Salmon()

## ??
harry = Halibut()

關(guān)于 class Name(object)

記得我曾經(jīng)強(qiáng)迫讓你使用 class Name(object) 卻沒告訴你為什么吧,現(xiàn)在你已經(jīng)知道了“類”和“對(duì)象”的區(qū)別,我就可以告訴你原因了。如果我早告訴你的話,你可能會(huì)暈掉,也學(xué)不會(huì)這門技術(shù)了。

真正的原因是在 Python 早期,它對(duì)于 class 的定義在很多方面都是嚴(yán)重有問題的。當(dāng)他們承認(rèn)這一點(diǎn)的時(shí)候已經(jīng)太遲了,所以逼不得已,他們需要支持這種有問題的 class。為了解決已有的問題,他們需要引入一種“新類”,這樣的話“舊類”還能繼續(xù)使用,而你也有一個(gè)新的正確的類可以使用了。

這就用到了“類即是對(duì)象”的概念。他們決定用小寫的“object”這個(gè)詞作為一個(gè)類,讓你在創(chuàng)建新類時(shí)從它繼承下來(lái)。有點(diǎn)暈了吧?一個(gè)類從另一個(gè)類繼承,而后者雖然是個(gè)類,但名字卻叫“object”……不過(guò)在定義類的時(shí)候,別忘記要從 object 繼承就好了。

的確如此。一個(gè)詞的不同就讓這個(gè)概念變得更難理解,讓我不得不現(xiàn)在才講給你。現(xiàn)在你可以試著去理解“一個(gè)是對(duì)象的類”這個(gè)概念了,如果你感興趣的話。

不過(guò)我還是建議你別去理解了,干脆完全忘記舊格式和新格式類的區(qū)別吧,就假設(shè) Python 的 class 永遠(yuǎn)都要求你加上 (object) 好了,你的腦力要留著思考更重要的問題。

附加題

1.研究一下為什么 Python 添加了這個(gè)奇怪的叫做 object 的類,它究竟有什么含義呢? 2.有沒有辦法把 Class 當(dāng)作 Object 使用呢? 3.在習(xí)題中為 animals、fish、還有 people 添加一些函數(shù),讓它們做一些事情??纯串?dāng)函數(shù)在 Animal 這樣的“基類(base class)”里和在 Dog 里有什么區(qū)別。 4.找些別人的代碼,理清里邊的“是啥”和“有啥”的關(guān)系。 5.使用列表和字典創(chuàng)建一些新的一對(duì)應(yīng)多的“has-many”的關(guān)系。 6.你認(rèn)為會(huì)有一種“has-many”的關(guān)系嗎?閱讀一下關(guān)于“多重繼承(multiple inheritance)”的資料,然后盡量避免這種用法。

常見問題

Q: 這些注釋符## ??是干什么的?

這些是你需要完成的“填空”,你需要填上 "is-a"或者 "has-a"。再讀一遍本節(jié)練習(xí),看看其他的注釋,弄明白我再說(shuō)什么。

Q: self.pet = None 是什么意思?

確保給 self.pet 設(shè)置了一個(gè)默認(rèn)值 None

Q: super(Employee, self).init(name)實(shí)現(xiàn)了什么?

這是用來(lái)執(zhí)行父類的init方法的,上網(wǎng)搜索一下“python super”相關(guān)文檔,閱讀文檔的各種建議。