<pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
    <pre id="vvttv"></pre>

      <p id="vvttv"></p>

          <p id="vvttv"></p>

                <p id="vvttv"></p>

                <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                  <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                    <p id="vvttv"></p>

                    習題 45: 對象、類、以及從屬關系?

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

                    魚和泥鰍有什么區別?

                    這個問題有沒有讓你有點暈呢?說真的,坐下來想一分鐘。我的意思是說,魚和泥鰍是不一樣,不過它們其實也是一樣的是不是?泥鰍是魚的一種,所以說沒什么不同,不過泥鰍又有些特別,它和別的種類的魚的確不一樣,比如泥鰍和黃鱔就不一樣。所以泥鰍和魚既相同又不同。怪了。

                    這個問題讓人暈的原因是大部分人不會這樣去思考問題,其實每個人都懂這一點,你無須去思考魚和泥鰍的區別,因為你知道它們之間的關系。你知道泥鰍是魚的一種,而且魚還有別的種類,根本就沒必要去思考這類問題。

                    讓我們更進一步,假設你有一只水桶,里邊有三條泥鰍。假設你的好人卡多到沒地方用,于是你給它們分別取名叫小方,小斌,小星。現在想想這個問題:

                    小方和泥鰍有什么區別?

                    這個問題一樣的奇怪,但比起魚和泥鰍的問題來還好點。你知道小方是一條泥鰍,所以他并沒什么不同,他只是泥鰍的一個“實例(instance)”。小斌和小星一樣也是泥鰍的實例。我的意思是說,它們是由泥鰍創建出來的,而且代表著和泥鰍一樣的屬性。

                    所以我們的思維方式是(你可能會有點不習慣):魚是一個“類(class)”,泥鰍是一個“類(class)”,而小方是一個“對象(object)”。仔細想想,然后我再一點一點慢慢解釋給你。

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

                    后來河蟹養殖專家路過,看到你的水桶,于是告訴你:“小伙子,你這些魚是泥鰍。” 專家一出,真相即現。并且專家還定義了一個新的叫做“泥鰍”的“類”,而這個“類”又有它特定的屬性。細長條?有胡須?愛鉆泥巴?吃起來味道還可以?那你就是一條泥鰍。

                    最后家庭煮父過來了,他跟河蟹專家說:“非也非也,你看到的是泥鰍,我看到的是小方,而且我要把小方和剁椒配一起做一道小菜。”于是你就有了一只叫做小方的泥鰍的“實例(instance)”(泥鰍也是魚的一個“實例”),并且你使用了它(把它塞到你的胃里了),這樣它就是一個“對象(object)”。

                    這會你應該了解了:小方是泥鰍的成員,而泥鰍又是魚的成員。這里的關系式:對象屬于某個類,而某個類又屬于另一個類。

                    寫成代碼是什么樣子?

                    這個概念有點繞人,不過實話說,你只要在創建和使用 class 的時候操心一下就可以了。我來給你兩個區分 ClassObject 的小技巧。

                    首先針對類和對象,你需要學會兩個說法,“is-a(是啥)”和“has-a(有啥)”。“是啥”要用在談論“兩者以類的關系互相關聯”的時候,而“有啥”要用在“兩者無共同點,僅是互為參照”的時候。

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

                    記住,“是啥”指的是魚和泥鰍的關系,而“有啥”指的是泥鰍和鰓的關系。

                    (譯注:為了解釋方便,譯文使用了中文魚名。原文使用的是“三文魚(salmon)”和“大比目魚(halibut)”,名字也是英文常用人名。)

                     1
                     2
                     3
                     4
                     5
                     6
                     7
                     8
                     9
                    10
                    11
                    12
                    13
                    14
                    15
                    16
                    17
                    18
                    19
                    20
                    21
                    22
                    23
                    24
                    25
                    26
                    27
                    28
                    29
                    30
                    31
                    32
                    33
                    34
                    35
                    36
                    37
                    38
                    39
                    40
                    41
                    42
                    43
                    44
                    45
                    46
                    47
                    48
                    49
                    50
                    51
                    52
                    53
                    54
                    55
                    56
                    57
                    58
                    59
                    60
                    61
                    62
                    63
                    64
                    65
                    66
                    67
                    68
                    69
                    70
                    71
                    72
                    73
                    74
                    75
                    76
                    ## 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()
                    

                    關于 class Name(object)?

                    記得我曾經強迫讓你使用 class Name(object) 卻沒告訴你為什么吧,現在你已經知道了“類”和“對象”的區別,我就可以告訴你原因了。如果我早告訴你的話,你可能會暈掉,也學不會這門技術了。

                    真正的原因是在 Python 早期,它對于 class 的定義在很多方面都是嚴重有問題的。當他們承認這一點的時候已經太遲了,所以逼不得已,他們需要支持這種有問題的 class。為了解決已有的問題,他們需要引入一種“新類”,這樣的話“舊類”還能繼續使用,而你也有一個新的正確的類可以使用了。

                    這就用到了“類即是對象”的概念。他們決定用小寫的“object”這個詞作為一個類,讓你在創建新類時從它繼承下來。有點暈了吧?一個類從另一個類繼承,而后者雖然是個類,但名字卻叫“object”……不過在定義類的時候,別忘記要從 object 繼承就好了。

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

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

                    加分習題?

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

                    Project Versions

                    Table Of Contents

                    Previous topic

                    習題 44: 給你的游戲打分

                    Next topic

                    習題 46: 一個項目骨架

                    This Page

                      <pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
                      <pre id="vvttv"></pre>

                        <p id="vvttv"></p>

                            <p id="vvttv"></p>

                                  <p id="vvttv"></p>

                                  <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                                    <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                                      <p id="vvttv"></p>

                                      这里只有精品视频