<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 習題 42: 物以類聚 雖說將函數放到字典里是很有趣的一件事情,你應該也會想到“如果 Python 能自動為你做這件事情該多好”。事實上也的確有,那就是 class 這個關鍵字。你可以使用 class 創建更棒的“函數字典”,比你在上節練習中做的強大多了。Class(類)有著各種各樣強大的功能和用法,但本書不會深入講這些內容,在這里,你只要你學會把它們當作高級的“函數字典”使用就可以了。 用到“class”的編程語言被稱作“Object Oriented Programming(面向對象編程)”語言。這是一種傳統的編程方式,你需要做出“東西”來,然后你“告訴”這些東西去完成它們的工作。類似的事情你其實已經做過不少了,只不過還沒有意識到而已。記得你做過的這個吧: ~~~ stuff = ['Test', 'This', 'Out'] print ' '.join(stuff) ~~~ 其實你這里已經使用了 class。stuff 這個變量其實是一個 listclass (列表類)。而 ''.join(stuff) 里調用函數 join 的字符串 '' (就是一個空格)也是一個 class —— 它是一個 string class (字符串類)。到處都是 class! 還有一個概念是 object(物件),不過我們暫且不提。當你創建過幾個 class 后就會學到了。你怎樣創建 class 呢?和你創建 ROOMS 的方法差不多,但其實更簡單: <table class="highlighttable"><tbody><tr><td class="linenos"> <div class="linenodiv"> <pre> 1&#13; 2&#13; 3&#13; 4&#13; 5&#13; 6&#13; 7&#13; 8&#13; 9&#13; 10&#13; 11&#13; 12&#13; 13&#13; 14&#13; 15&#13; 16&#13; 17&#13; 18&#13; 19&#13; 20&#13; 21&#13; 22&#13; 23&#13; 24&#13; 25&#13; 26&#13; 27&#13; 28&#13; 29&#13; 30&#13; 31&#13; 32&#13; 33&#13; 34&#13; 35&#13; 36&#13; 37</pre> </div> </td> <td class="code"> <div class="highlight"> <pre>class TheThing(object):&#13; &#13; def __init__(self):&#13; self.number = 0&#13; &#13; def some_function(self):&#13; print "I got called."&#13; &#13; def add_me_up(self, more):&#13; self.number += more&#13; return self.number&#13; &#13; # two different things&#13; a = TheThing()&#13; b = TheThing()&#13; &#13; a.some_function()&#13; b.some_function()&#13; &#13; print a.add_me_up(20)&#13; print b.add_me_up(30)&#13; &#13; print a.number&#13; print b.number&#13; &#13; # Study this. This is how you pass a variable&#13; # from one class to another. You will need this.&#13; class TheMultiplier(object):&#13; &#13; def __init__(self, base):&#13; self.base = base&#13; &#13; def do_it(self, m):&#13; return m * self.base&#13; &#13; x = TheMultiplier(a.number)&#13; print x.do_it(b.number)&#13; </pre> </div> </td> </tr></tbody></table> Warning 嗯,你開始看到 Python 的“疣子”了。Python 是一門比較舊的語言,其中包含很多丑陋的設計決定。為了將這些丑陋設計掩蓋過去,他們就做了一些新的丑陋設計,然后告訴人們讓他們習慣這些新的壞設計。classTheThing(object) 就是其中一個例子。這里我就不展開講了,不過你也不必操心為什么你的 class 要在后面添一個(object) ,只要跟著這樣做就可以了,否則將來總有一天別的 Python 程序員會吼你讓你這樣做。后面我們再講為什么。 你看到參數里的 self 了吧?你知道它是什么東西嗎?對了,它就是 Python 創建的額外的一個參數,有了它你才能實現 a.some_function()`這種用法,這時它就會把\前者翻譯成``some_function(a) 執行下去。為什么用 self 呢?因為你的函數并不知道你的這個“實例”是來自叫 TheThing 或者別的名字的 class。所以你只要使用一個通用的名字 self 。這樣你寫出來的函數就會在任何情況下都能正常工作。 其實你可以使用 self 以外的別的字眼,不過如果你這樣做的話,你就會成為所有Python 程序員的眾之矢的,所以還是隨大流的好。只有變態才會在這里亂改,我教你的沒錯。對以后會讀到你的代碼的人好點兒,因為你現在的代碼10年以后所有的代碼都會是一團糟。 接下來,看到 __init__ 函數了嗎?這就是你為 Python class 設置內部變量的方式。你可以使用 . 將它們設置到 self 上面。另外看到我們使用了 add_me_up() 為你創建的 self.number 加值。后面你可以看到我們怎樣可以使用這種方法為數字加值,然后打印出來。 接著我創建了另一個叫 TheMutiplier 的 class,它的功能是做乘法。這樣的 class 其實是非常沒必要的,不過它向你展示了如何將變量和狀態從一個 class 傳遞到另一個 class。在這里我使用了 TheMultiplier.__init__ 來從 a.number 來獲取基本數值,我還將 b.number 傳遞到 TheMultiplier.do_it 以供調用。好好研究一下,你需要相關的知識來完成后面的加分習題。 Class 是很強大的東西,你應該好好讀讀相關的東西。盡可能多找些東西讀并且多多實驗。你其實知道它們該怎么用,只要試試就知道了。其實我馬上就要去練吉他了,所以我不會讓你寫練習了。你將使用 class 寫一個練習。 接下來我們將把習題41的內容重寫,不過這回我們將使用 class: <table class="highlighttable"><tbody><tr><td class="linenos"> <div class="linenodiv"> <pre> 1&#13; 2&#13; 3&#13; 4&#13; 5&#13; 6&#13; 7&#13; 8&#13; 9&#13; 10&#13; 11&#13; 12&#13; 13&#13; 14&#13; 15&#13; 16&#13; 17&#13; 18&#13; 19&#13; 20&#13; 21&#13; 22&#13; 23&#13; 24&#13; 25&#13; 26&#13; 27&#13; 28&#13; 29&#13; 30&#13; 31&#13; 32&#13; 33&#13; 34&#13; 35&#13; 36&#13; 37&#13; 38&#13; 39&#13; 40&#13; 41&#13; 42&#13; 43&#13; 44&#13; 45&#13; 46&#13; 47&#13; 48&#13; 49&#13; 50&#13; 51&#13; 52&#13; 53&#13; 54&#13; 55&#13; 56&#13; 57&#13; 58&#13; 59&#13; 60&#13; 61&#13; 62&#13; 63&#13; 64&#13; 65&#13; 66&#13; 67&#13; 68&#13; 69&#13; 70&#13; 71&#13; 72&#13; 73&#13; 74&#13; 75&#13; 76</pre> </div> </td> <td class="code"> <div class="highlight"> <pre>## Animal is-a object (yes, sort of confusing) look at the extra credit&#13; class Animal(object):&#13; pass&#13; &#13; ## ??&#13; class Dog(Animal):&#13; &#13; def __init__(self, name):&#13; ## ??&#13; self.name = name&#13; &#13; ## ??&#13; class Cat(Animal):&#13; &#13; def __init__(self, name):&#13; ## ??&#13; self.name = name&#13; &#13; ## ??&#13; class Person(object):&#13; &#13; def __init__(self, name):&#13; ## ??&#13; self.name = name&#13; &#13; ## Person has-a pet of some kind&#13; self.pet = None&#13; &#13; ## ??&#13; class Employee(Person):&#13; &#13; def __init__(self, name, salary):&#13; ## ?? hmm what is this strange magic?&#13; super(Employee, self).__init__(name)&#13; ## ??&#13; self.salary = salary&#13; &#13; ## ??&#13; class Fish(object):&#13; pass&#13; &#13; ## ??&#13; class Salmon(Fish):&#13; pass&#13; &#13; ## ??&#13; class Halibut(Fish):&#13; pass&#13; &#13; &#13; ## rover is-a Dog&#13; rover = Dog("Rover")&#13; &#13; ## ??&#13; satan = Cat("Satan")&#13; &#13; ## ??&#13; mary = Person("Mary")&#13; &#13; ## ??&#13; mary.pet = satan&#13; &#13; ## ??&#13; frank = Employee("Frank", 120000)&#13; &#13; ## ??&#13; frank.pet = rover&#13; &#13; ## ??&#13; flipper = Fish()&#13; &#13; ## ??&#13; crouse = Salmon()&#13; &#13; ## ??&#13; harry = Halibut()&#13; </pre> </div> </td> </tr></tbody></table> ### 你應該看到的結果 這個版本的游戲和你的上一版效果應該是一樣的,其實有些代碼都幾乎一樣。比較一下兩版代碼,弄懂其中不同的地方,重點需要理解這些東西: 1. 怎樣創建一個 classGame(object) 并且放函數到里邊去。 1. __init__ 是一個特殊的初始方法,可以預設重要的變量在里邊。 1. 為 class 添加函數的方法是將函數在 class 下再縮進一階,class 的架構就是通過縮進實現的,這點很重要。 1. 你在函數里的內容又縮進了一階。 1. 注意冒號的用法。 1. 理解 self 的概念,以及它在 __init__ 、 play 、 death 里是怎樣使用的。 1. 研究 play 里的 getattr 的功能,這樣你就能明白 play 所做的事情。其實你可以手動在 Python 命令行實驗一下,從而弄懂它。 1. 最后我們怎樣創建了一個 Game ,然后通過 play() 讓所有的東西運行起來。 ### 加分習題 1. 研究一下 __dict__ 是什么東西,應該怎樣使用。 1. 再為游戲添加一些房間,確認自己已經學會使用 class 。 1. 創建一個新版本,里邊使用兩個 class,其中一個是 Map ,另一個是 Engine 。提示: 把 play 放到 Engine 里面。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看