整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          Python關(guān)于class(類)的知識

          錄:

          面向?qū)ο缶幊?,類的定義,類的屬性,類方法,__init__ 初始化魔法方法


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

          面向?qū)ο?object-oriented ;簡稱: OO) 至今還沒有統(tǒng)一的概念 我這里把它定義為: 按人們 認(rèn)識客觀世界的系統(tǒng)思維方式,采用基于對象(實體) 的概念建立模型,模擬客觀世界分析、設(shè)計、實現(xiàn)軟件的辦法。

          # **程序是由數(shù)據(jù)和功能組合而成的對象構(gòu)建起來的**

          面向?qū)ο缶幊?Object Oriented Programming-OOP) 是一種解決軟件復(fù)用的設(shè)計和編程方法。 這種方法把軟件系統(tǒng)中相近相似的操作邏輯和操作應(yīng)用數(shù)據(jù)、狀態(tài),以類的型式描述出來,

          # 以對象實例的形式在軟件系統(tǒng)中復(fù)用,以達(dá)到提高軟件開發(fā)效率的作用。


          • 面向過程 VS. 面向?qū)ο?/li>
          面向過程:根據(jù)業(yè)務(wù)邏輯從上到下寫代碼,
          面向?qū)ο螅簩?shù)據(jù)與函數(shù)綁定到一起,進行封裝,這樣能夠更快速的開發(fā)程序,減少了重復(fù)代碼的重寫過程
          
          - 面向?qū)ο蠛兔嫦蜻^程都是解決問題的一種思路而已
          
            - 當(dāng)遇到一個需求的時候不用自己去實現(xiàn),如果自己一步步實現(xiàn)那就是面向過程
            - 應(yīng)該找一個專門做這個事的人來做
            - 面向?qū)ο笫腔诿嫦蜻^程的




          如何將面對對象帶入到編程中去?----通過class 類


          類的定義

          • 類基本概念及理解

          類是對象的抽象化,類是一群具有相同特征或行為的事物的統(tǒng)稱。(如人類)


          • 類的定義的格式
          class 類名():
              pass


          • 類的命名規(guī)則:
          駝峰命名法(首字母大寫)
          只能是一個詞,不能有空格。
          只能包含字母、數(shù)字、和下劃線。
          不能以數(shù)字開頭。
          不可以使用關(guān)鍵字(重名) 例如int,class
          取名盡量有意義---見名思意


          • 調(diào)用:類的實例化
          class Person():
              pass
          
          # 調(diào)用:類的實例化
          wum = Person()  # wum是Person類的一個實例對象
          mar = Person()  # 同上


          • 類的構(gòu)成:屬性及方法
          類可以看作是獨立存放【屬性及方法】的空間。
          類就像人擁有其獨特的特性(屬性)以及行動(方法)


          • 類與實例之間的聯(lián)系
          類是一個事物的抽象,不是真實存在的,描繪了事物的共性
          實例:某類事物的具體個體,是該類事物的具體表現(xiàn),真實存在
          
          實例是存放變量的空間,不同實例之間互不可見,即互不影響
          ***實例對象可以獲得類中所有的屬性及方法***
            在查找屬性時,會優(yōu)先在實例中查找,然后在類中查找


          類的屬性----共有屬性 和 私有屬性

          • 可以通過dir()查看類的內(nèi)置屬性、內(nèi)置方法、內(nèi)置函數(shù)

          dir()查看類的內(nèi)置屬性


          • 共有屬性----可直接訪問、修改

          共有屬性前沒有下劃線,實例可以直接訪問,也可以修改

          共有屬性----可直接訪問、修改


          • 私有屬性分兩類:
          屬性前加'_'一個下劃線,外部可以直接訪問
          屬性前加'__'兩個下劃線,外部不可以直接訪問,因為訪問名稱改變了,可以通過dir()查看
          私有屬性可以更好的保存屬性安全,即不能隨意修改
          
          # 私有屬性是一種規(guī)范,并非限制,因此可以通過特定的方法訪問私有屬性
          # 定義在類中的私有屬性也可以被子類(實例對象)繼承


          屬性前加'__'兩個下劃線,外部不可以直接訪問


          _ 和 __這是一種規(guī)范(約定), 沒有真正的限制作用,因此仍可以訪問前面有兩條下劃線的私有屬性。

          訪問兩條下劃線的私有屬性的方法:_類名+__私有屬性名(例如:_Person__age)


          訪問兩條下劃線的私有屬性的方法:_類名+__私有屬性名


          • 實例對象類屬性的添加
          class Person():
              name = '小明'
          
          xiaoming = Person()
          xiaoming.age = 18     #給xiaoming這個實例對象添加age屬性,而Person類是沒有age這個屬性的
          print(xiaoming.age)

          18


          類方法

          類方法就是針對 類對象定義的方法;如果類是人類,那么類方法可以理解為是人類的行動


          • 定義類方法的格式:通常將默認(rèn)傳入方法名后的參數(shù)命名為self

          self代表實例對象本身

          方法總是定義在類中,但是卻叫實例方法,因為它表示該類所有實例共有的行為

          class Person():

          def 方法名(self): #定義類方法一定要在類中,因此要注意左邊縮進

          pass


          • 調(diào)用類方法

          通過實例對象調(diào)用


          常規(guī)調(diào)用方法


          在方法中調(diào)用屬性


          在方法中調(diào)用其他方法


          __init__ 初始化魔法方法

          定義和用途

          #定義:

          所謂魔法方法,就是在特定條件下,自動觸發(fā)方法。

          __init__魔法方法則是在實例化后自動調(diào)用,以完成實例初始化。


          #用途:

          該函數(shù)可用于解決:每一個實例化對象需要不同的屬性

          **初始化的定義必須在類的開頭**

          __init__ 初始化魔法方法


          在初始化定義時:

          1.多個屬性的值可以在實例對象調(diào)用時傳入

          2.可以固定屬性的值

          3.可以修改固定屬性的值

          #定義類
          class Person():
              def __init__(self,num,name):
                  self.age = num    
          
                  self.gender = '男'      
          #固定屬性的值,即所有實例對象都有g(shù)ender屬性值('男'),若要修改可以在實例對象調(diào)用時直接改
          
                  self.name = name     
                  
          
          #調(diào)用實例
          xiaoming = Person(8,'小明')
          print(xiaoming.age)    
          print(xiaoming.name)       
          print(xiaoming.gender)
          
          h = Person(50,'h')
          print(h.gender)
          
          xiaohua = Person(18,'小花')
          xiaohua.gender = '女'           #將xiaohua這個實例對象的gender從 '男' 改成 '女'
          print(xiaohua.gender)

          8

          小明

          男 -------h.gender

          女--------xiaohua.gender


          私有屬性調(diào)用方式:

          1.調(diào)用私有屬性方式:_類名__屬性名

          2.在方法中調(diào)用私有屬性,在外部調(diào)用時可以直接調(diào)取

          3.可以定義一個方法,專門返回私有屬性,這樣在外部調(diào)用該方法時,可以直接調(diào)用私有屬性

          4.可以定義一個方法,專門返回改變后的屬性,再用返回私有屬性方法,打印改變后的屬性

          5.最后返回的結(jié)果和定義時的函數(shù)順序無關(guān),和調(diào)用實例對象時的代碼順序有關(guān)


          class Person():
              def __init__(self,name):
                  self.__name = name      #__name是私有屬性
          
              def eat(self):
                  print(f'{self.__name}吃飯')      
          #在方法中調(diào)用私有屬性,在外部可以直接調(diào)用該方法獲得私有屬性
          
              def to(self):                #查找返回私有屬性
                  return self.__name
          
              def set_name(self,newname):      #修改私有屬性
                  self.__name = newname
          
          xiaoming = Person('小明')
          xiaoming.eat()              #調(diào)用eat方法,可以直接調(diào)用私有屬性name
          print(xiaoming.to())        #查找修改前的私有屬性name
          xiaoming.set_name('hhh')    #調(diào)用set_name方法,修改私有屬性name的值為'hhh'
          print(xiaoming.to())        #查找修改后的私有屬性name
          
          #最后返回的結(jié)果和定義時的函數(shù)順序無關(guān),和調(diào)用實例對象的代碼順序有關(guān),
          因此雖然在定義方法時,to查找方法在set_name修改方法之前,但是他們的定義順序和最后輸出的
          結(jié)果無關(guān),只要在調(diào)用方法時注意他們的先后順序就能輸出想要的結(jié)果(修改前或修改后的私有屬性)

          小明吃飯

          小明 ----修改前的私有屬性

          hhh ----修改后的私有屬性

          建Web游戲



          今天小編教大家如何用Python編程語言創(chuàng)建Web游戲,如果你能完成,你就可以算是一個能力相當(dāng)不錯的Python初學(xué)者了。雖然還需要多讀一些書,多寫一些程序,不過你已經(jīng)具備進一步學(xué)習(xí)的功底了。接下來的學(xué)習(xí)就只是時間、動力及資源的問題了。

          在這個習(xí)題中,我們不會去創(chuàng)建一個完整的游戲,相反,我們會為習(xí)題42中的游戲創(chuàng)建一個“引擎”(engine),讓這個游戲能夠在瀏覽器中運行起來。這會涉及重構(gòu)習(xí)題42中的游戲,混合習(xí)題47中的結(jié)構(gòu),添加自動測試代碼,最后創(chuàng)建一個可以運行這個游戲的Web引擎。

          這是一個很龐大的習(xí)題。預(yù)計你要花一周到一個月才能完成。最好的方法是一點一點來,每晚完成一點,在進行下一步之前確認(rèn)上一步已經(jīng)正確完成。

          重構(gòu)習(xí)題43中的游戲

          你已經(jīng)在兩個習(xí)題中修改了gothonweb項目,這個習(xí)題中會再修改一次。你學(xué)習(xí)的這種修改的技術(shù)叫做“重構(gòu)”,或者用我喜歡的講法來說,叫“修理”。重構(gòu)是一個編程術(shù)語,它指的是清理舊代碼或者為舊代碼添加新功能的過程。你其實已經(jīng)做過這樣的事情了,只不過不知道這個術(shù)語而已。重構(gòu)是軟件開發(fā)中經(jīng)歷的最習(xí)以為常的事情。

          在這個習(xí)題中你要做的是將習(xí)題47中的可以測試的房間地圖和習(xí)題43中的游戲這兩樣?xùn)|西合并到一起,創(chuàng)建一個新的游戲結(jié)構(gòu)。游戲的內(nèi)容不會發(fā)生變化,只不過我們會通過“重構(gòu)”讓它有一個更好的結(jié)構(gòu)而已。

          第一步是將ex47/game.py的內(nèi)容復(fù)制到gothonweb/map.py中,然后將tests/ex47_tests.py的內(nèi)容復(fù)制到tests/map_tests.py中,然后再次運行nosetests,確認(rèn)它們還能正常工作。

          注意

          從現(xiàn)在開始,我不會再展示運行測試的輸出了,我假設(shè)你會回去運行這些測試,而且知道什么樣的輸出是正確的。

          將習(xí)題47的代碼復(fù)制完畢后,就該開始重構(gòu)它,讓它包含習(xí)題43中的地圖。我一開始會把基本結(jié)構(gòu)為你準(zhǔn)備好,然后你需要去完成map.py和map_tests.py里邊的內(nèi)容。

          首先要做的是用Room這個類來構(gòu)建地圖的基本結(jié)構(gòu)。

          map.py

          1  class Room(object):
          2  
          3      def __init__(self, name, description):
          4          self.name = name
          5          self.description = description
          6          self.paths = []
          7  
          8      def go(self, direction):
          9           return self.paths.get(direction, None)
          10  
          11      def add_paths(self, paths):
          12           self.paths.update(paths)
          13  
          14  
          15  central_corridor = Room("Central Corridor",
          16  """
          17  The Gothons of Planet Percal #25 have invaded your ship and destroyed
          18  your entire crew.  You are the last surviving member and your last
          19  mission is to get the neutron destruct bomb from the Weapons Armory,
          20  put it in the bridge, and blow the ship up after getting into an 
          21  escape pod.
          22  
          23  You're running down the central corridor to the Weapons Armory when
          24  a Gothon jumps out, red scaly skin, dark grimy teeth, and evil clown costume
          25  flowing around his hate filled body.  He's blocking the door to the
          26  Armory and about to pull a weapon to blast you.
          27  """)
          28  
          29  
          30  laser_weapon_armory = Room("Laser Weapon Armory",
          31  """
          32  Lucky for you they made you learn Gothon insults in the academy.
          33  You tell the one Gothon joke you know:
          34  Lbhe zbgure vf fb sng, jura fur fvgf nebhaq gur ubhfr, fur fvgf nebhaq gur ubhfr.
          35  The Gothon stops, tries not to laugh, then busts out laughing and can't move.
          36  While he's laughing you run up and shoot him square in the head
          37  putting him down, then jump through the Weapon Armory door.
          38  
          39  You do a dive roll into the Weapon Armory, crouch and scan the room
          40  for more Gothons that might be hiding.  It's dead quiet, too quiet.
          41  You stand up and run to the far side of the room and find the
          42  neutron bomb in its container.  There's a keypad lock on the box
          43  and you need the code to get the bomb out.  If you get the code
          44  wrong 10 times then the lock closes forever and you can't
          45  get the bomb.  The code is 3 digits.
          46  """)
          47  
          48  
          49  the_bridge = Room("The Bridge",
          50  """
          51  The container clicks open and the seal breaks, letting gas out.
          52  You grab the neutron bomb and run as fast as you can to the
          53  bridge where you must place it in the right spot.
          54  
          55  You burst onto the Bridge with the netron destruct bomb
          56  under your arm and surprise 5 Gothons who are trying to
          57  take control of the ship.  Each of them has an even uglier
          58  clown costume than the last.  They haven't pulled their
          59  weapons out yet, as they see the active bomb under your
          60  arm and don't want to set it off.
          61  """)
          62  
          63  
          64  escape_pod = Room("Escape Pod",
          65  """
          66  You point your blaster at the bomb under your arm
          67  and the Gothons put their hands up and start to sweat.
          68  You inch backward to the door, open it, and then carefully
          69  place the bomb on the floor, pointing your blaster at it.
          70  You then jump back through the door, punch the close button
          71  and blast the lock so the Gothons can't get out.
          72  Now that the bomb is placed you run to the escape pod to
          73  get off this tin can.
          74  
          75  You rush through the ship desperately trying to make it to
          76  the escape pod before the whole ship explodes.  It seems like
          77  hardly any Gothons are on the ship, so your run is clear of
          78  interference.  You get to the chamber with the escape pods, and
          79  now need to pick one to take.  Some of them could be damaged
          80  but you don't have time to look.  There's 5 pods, which one
          81  do you take?
          82  """)
          83  
          84  
          85  the_end_winner = Room("The End",
          86  """
          87  You jump into pod 2 and hit the eject button.
          88  The pod easily slides out into space heading to
          89  the planet below.  As it flies to the planet, you look
          90  back and see your ship implode then explode like a
          91  bright star, taking out the Gothon ship at the same
          92  time.  You won!
          93  """)
          94  
          95  
          96  the_end_loser = Room("The End",
          97  """
          98  You jump into a random pod and hit the eject button.
          99  The pod escapes out into the void of space, then
          100  implodes as the hull ruptures, crushing your body
          101  into jam jelly.
          102  """
          103  )
          104  
          105  escape_pod.add_paths({
          106      '2': the_end_winner,
          107      '*': the_end_loser
          108  })
          109  
          110  generic_death = Room("death", "You died.")
          111  
          112  the_bridge.add_paths({
          113      'throw the bomb': generic_death,
          114      'slowly place the bomb': escape_pod
          115  })
          116  
          117  laser_weapon_armory.add_paths({
          118      '0132': the_bridge,
          119      '*': generic_death
          120  })
          121  
          122  central_corridor.add_paths({
          123      'shoot!': generic_death,
          124      'dodge!': generic_death,
          125      'tell a joke': laser_weapon_armory
          126  })
          127  
          128  START = central_corridor

          你會發(fā)現(xiàn)Room類和地圖有一些問題。

          1.我們必須把以前放在if-else結(jié)構(gòu)中的房間描述做成每個房間的一部分。這樣房間的次序就不會被打亂了,這對我們的游戲是一件好事。這是你后面要修改的東西。

          2.原版游戲中我們使用了專門的代碼來生成一些內(nèi)容,如炸彈的激活鍵碼、艦艙的選擇等,這次我們做游戲時就先使用默認(rèn)值好了,不過后面的附加練習(xí)里,我會要求你把這些功能再加到游戲中。

          3.我為游戲中所有錯誤決策的失敗結(jié)尾寫了一個generic_death,你需要去補全這個函數(shù)。你需要把原版游戲中所有的場景結(jié)局都加進去,并確保代碼能正確運行。

          4.我添加了一種新的轉(zhuǎn)換模式,以"*"為標(biāo)記,用來在游戲引擎中實現(xiàn)“捕獲所有操作”的功能。

          等把上面的代碼基本寫好以后,接下來就是你必須繼續(xù)寫的自動測試tests/map_test.py了。

          map_tests.py

          1  from nose.tools import *
          2  from gothonweb.map import *
          3  
          4  def test_room():
          5       gold = Room("GoldRoom", 
          6                      """This room has gold in it you can grab. There's a
          7                      door to the north.""")
          8       assert_equal(gold.name, "GoldRoom")
          9       assert_equal(gold.paths, {})
          10  
          11  def test_room_paths():
          12      center = Room("Center", "Test room in the center.")
          13      north = Room("North", "Test room in the north.")
          14      south = Room("South", "Test room in the south.")
          15  
          16      center.add_paths({'north': north, 'south': south})
          17      assert_equal(center.go('north'), north)
          18      assert_equal(center.go('south'), south)
          19  
          20  def test_map():
          21      start = Room("Start", "You can go west and down a hole.")
          22      west = Room("Trees", "There are trees here, you can go east.")
          23      down = Room("Dungeon", "It's dark down here, you can go up.")
          24  
          25      start.add_paths({'west': west, 'down': down})
          26      west.add_paths({'east': start})
          27      down.add_paths({'up': start})
          28  
          29      assert_equal(start.go('west'), west)
          30      assert_equal(start.go('west').go('east'), start)
          31      assert_equal(start.go('down').go('up'), start)
          32  
          33  def test_gothon_game_map():
          34      assert_equal(START.go('shoot!'), generic_death)
          35      assert_equal(START.go('dodge!'), generic_death)
          36  
          37      room = START.go('tell a joke')
          38      assert_equal(room, laser_weapon_armory)

          你在這個習(xí)題中的任務(wù)是完成地圖,并且讓自動測試可以完整地檢查整個地圖。這包括將所有的generic_death對象修正為游戲中實際的失敗結(jié)尾。讓你的代碼成功運行起來,并讓你的測試越全面越好。后面我們會對地圖做一些修改,到時候這些測試將用來確保修改后的代碼還可以正常工作。

          會話和用戶跟蹤

          在Web應(yīng)用程序運行的某個位置,你需要追蹤一些信息,并將這些信息和用戶的瀏覽器關(guān)聯(lián)起來。在HTTP協(xié)議的框架中,Web環(huán)境是“無狀態(tài)”的,這意味著你的每一次請求和你的其他請求都是相互獨立的。如果你請求了頁面A,輸入了一些數(shù)據(jù),然后點了一個頁面B的鏈接,那你發(fā)送給頁面A的數(shù)據(jù)就全部消失了。

          解決這個問題的方法是為Web應(yīng)用程序建立一個很小的數(shù)據(jù)存儲,給每個瀏覽器進程賦予一個獨一無二的數(shù)字,用來跟蹤瀏覽器所做的事情。這個存儲通常用數(shù)據(jù)庫或者存儲在磁盤上的文件來實現(xiàn)。在lpthw.web這個小框架中實現(xiàn)這樣的功能是很容易的,下面就是一個這樣的例子。

          session.sample.py

          1  import web
          2  
          3  web.config.debug = False
          4  
          5  urls = (
          6        "/count", "count",
          7        "/reset", "reset"
          8  )
          9  app = web.application(urls, locals())
          10  store = web.session.DiskStore('sessions')
          11  session = web.session.Session(app, store, initializer=['count': 0])
          12  
          13  class count:
          14       def GET(self):
          15            session.count += 1
          16            return str(session.count)
          17  
          18  class reset:
          19       def GET(self):
          20            session.kill()
          21            return ""
          22  
          23  if __name__ == "__main__":
          24      app.run()

          為了實現(xiàn)這個功能,需要創(chuàng)建一個sessions/文件夾作為程序的會話存儲位置,創(chuàng)建好以后運行這個程序,然后檢查/count頁面,刷新一下這個頁面,看計數(shù)會不會累加上去。關(guān)掉瀏覽器后,程序就會“忘掉”之前的位置,這也是我們的游戲所需的功能。有一種方法可以讓瀏覽器永遠(yuǎn)記住一些信息,不過這會讓測試和開發(fā)變得更難。如果你回到/reset頁面,然后再訪問/count頁面,你可以看到你的計數(shù)器被重置了,因為你已經(jīng)關(guān)掉了這個會話。

          你需要花點時間弄懂這段代碼,注意會話開始時count的值是如何設(shè)為0的,另外再看看sessions/下面的文件,看能不能打開。下面是我打開一個Python會話并解碼的過程:

          >>> import pickle
          >>> import base64
          >>> base64.b64decode(open("sessions/XXXXX").read())
          "(dp1\nS'count'\np2\nI1\nsS'ip'\np3\nV127.0.0.1\np4\nsS'session_id'\np5\nS'XXXX'\np6\ns."
          >>>
          >>> x = base64.b64decode(open("sessions/XXXXX").read())
          >>>
          >>> pickle.loads(x)
          {'count': 1, 'ip': u'127.0.0.1', 'session_id': 'XXXXX'}

          所以,會話其實就是使用pickle和base64這些庫寫到磁盤上的字典。存儲和管理會話的方法很多,大概和Python的Web框架那么多,所以了解它們的工作原理并不是很重要。當(dāng)然如果你需要調(diào)試或者清空會話,知道點兒原理還是有用的。

          創(chuàng)建引擎

          你應(yīng)該已經(jīng)寫好了游戲地圖和它的單元測試代碼?,F(xiàn)在要你制作一個簡單的游戲引擎,用來讓游戲中的各個房間運轉(zhuǎn)起來,從玩家收集輸入,并且記住玩家所在的位置。我們將用到你剛學(xué)過的會話來制作一個簡單的引擎,讓它可以:

          1.為新用戶啟動新的游戲;

          2.將房間展示給用戶;

          3.接收用戶的輸入;

          4.在游戲中處理用戶的輸入;

          5.顯示游戲的結(jié)果,繼續(xù)游戲,直到玩家角色死亡為止。

          為了創(chuàng)建這個引擎,你需要將bin/app.py搬過來,創(chuàng)建一個功能完備的、基于會話的游戲引擎。這里的難點是,我會先使用基本的HTML文件創(chuàng)建一個非常簡單的版本,接下來將由你完成它?;镜囊媸窍旅孢@個樣子的:

          app.py

          1  import web
          2  from gothonweb import map
          3  
          4  urls = (
          5      '/game', 'GameEngine',
          6      '/', 'Index',
          7  )
          8  
          9  app = web.application(urls, globals())
          10  
          11  # little hack so that debug mode works with sessions
          12  if web.config.get('_session') is None:
          13        store = web.session.DiskStore('sessions')
          14        session = web.session.Session(app, store,
          15                                            initializer=['room': None])
          16      web.config._session = session
          17  else:
          18       session = web.config._session
          19  
          20  render = web.template.render('templates/', base="layout")
          21  
          22  
          23  class Index(object):
          24       def GET(self):
          25          # this is used to "setup" the session with starting values
          26          session.room = map.START
          27          web.seeother("/game")
          28  
          29  
          30  class GameEngine(object):
          31  
          32      def GET(self):
          33           if session.room:
          34                return render.show_room(room=session.room)
          35           else:
          36              # why is there here? do you need it?
          37              return render.you_died()
          38  
          39      def POST(self):
          40           form = web.input(action=None)
          41  
          42          # there is a bug here, can you fix it?
          43          if session.room and form.action:
          44               session.room = session.room.go(form.action)
          45  
          46          web.seeother("/game")
          47  
          48  if __name__ == "__main__":
          49      app.run()

          在這個腳本里你可以看到更多的新東西,不過了不起的事情是,整個基于網(wǎng)頁的游戲引擎只要一個小文件就可以做到了。這段腳本里最有技術(shù)含量的就是將會話帶回來的那幾行,這對于調(diào)試模式下的代碼重載是必需的,否則每次刷新網(wǎng)頁,會話就會消失,游戲也不會再繼續(xù)了。

          在運行bin/app.py之前,你需要修改PYTHONPATH環(huán)境變量。不知道什么是環(huán)境變量?要運行一個最基本的Python程序,你就得學(xué)會環(huán)境變量,用Python的人就喜歡這樣:

          在終端輸入下面的內(nèi)容:

          export PYTHONPATH=$PYTHONPATH:.

          如果用的是Windows,那就在PowerShell中輸入以下內(nèi)容:

          $env:PYTHONPATH = "$env:PYTHONPATH;."

          你只要針對每一個shell會話輸入一次就可以了,不過如果你運行Python代碼時看到了導(dǎo)入錯誤,那就需要去執(zhí)行一下上面的命令,或者是因為你上次執(zhí)行的有錯才導(dǎo)致導(dǎo)入錯誤的。

          接下來需要刪掉templates/hello_form.html和templates/index.html,然后重新創(chuàng)建上面代碼中提到的兩個模板。下面是一個非常簡單的templates/show_room.html,供你參考。

          show_room.html

          $def with (room)
          
          <h1> $room.name </h1>
          
          <pre>
          $room.description
          </pre>
          
          $if room.name == "death":
              <p><a href="/">Play Again?</a></p>
          $else:
              <p>
              <form action="/game" method="POST">
                  - <input type="text" name="action"> <input type="SUBMIT">
              </form>
              </p>

          這就用來顯示游戲中的房間的模板。接下來,你需要在用戶跑到地圖的邊界時,用一個模板告訴用戶,他的角色的死亡信息,也就是templates/you_died.html這個模板。

          you_died.html

          <h1>You Died!</h1>
          
          <p>Looks like you bit the dust.</p>
          <p><a href="/">Play Again</a></p>

          準(zhǔn)備好這些文件就可以做下面的事情了。

          1.再次運行測試代碼tests/app_tests.py,這樣就可以測試這個游戲。由于會話的存在,你可能頂多只能實現(xiàn)幾次點擊,不過你應(yīng)該可以做出一些基本的測試來。

          2.刪除sessions/*下的文件,再重新運行一遍游戲,確認(rèn)游戲是從一開始運行的。

          3. 運行python bin/app.py腳本,試玩一下你的游戲。

          你需要和往常一樣刷新和修正你的游戲,慢慢修改游戲的HTML文件和引擎,直到實現(xiàn)游戲需要的所有功能為止。

          期末考試

          你有沒有覺得我一下子給了你超多的信息呢?那就對了,我想要你在學(xué)習(xí)技能的同時有一些可以用來鼓搗的東西。為了完成這個習(xí)題,我將給你最后一套需要你自己完成的練習(xí)。你會注意到,到目前為止你寫的游戲并不是很好,這只是你的第一版代碼而已,你現(xiàn)在的任務(wù)就是讓游戲更加完善,實現(xiàn)下面的這些功能。

          1.修正代碼中所有我提到和沒提到的bug,如果你發(fā)現(xiàn)了新bug,你可以告訴我。

          2.改進所有的自動測試,以便可以測試更多的內(nèi)容,直到你可以不用瀏覽器就能測到所有的內(nèi)容為止。

          3.讓HTML頁面看上去更美觀一些。

          4.研究一下網(wǎng)頁登錄系統(tǒng),為這個程序創(chuàng)建一個登錄界面,這樣人們就可以登錄這個游戲,并且可以保存游戲高分。

          5.完成游戲地圖,盡可能地把游戲做大,功能做全。

          6.給用戶一個“幫助系統(tǒng)”,讓他們可以查詢每個房間里可以執(zhí)行哪些命令。

          7.為游戲添加新功能,想到什么功能就添加什么功能。

          8.創(chuàng)建多個地圖,讓用戶可以選擇他們想要玩的一張地圖來進行游戲。你的bin/app.py應(yīng)該可以運行提供給它的任意地圖,這樣你的引擎就可以支持多個不同的游戲。

          9.最后,使用在習(xí)題48和習(xí)題49中學(xué)到的東西創(chuàng)建一個更好的輸入處理器。你手頭已經(jīng)有了大部分必要的代碼,只需要改進語法,讓它和你的輸入表單以及游戲引擎掛鉤即可。

          祝你好運!

          常見問題回答

          我在游戲中用了會話(`session)`,不能用nosetests測試。

          你需要閱讀并了解帶reloader的會話:http://webpy.org/cookbook/session_with_reloader。

          我看到了ImportError。

          錯誤路徑,錯誤Python版本,PYTHONPATH沒設(shè)置對,漏了__init__.py文件,拼寫錯誤,都檢查一下吧。

          頭條創(chuàng)作挑戰(zhàn)賽#

          在Python中,class是一種用于創(chuàng)建對象的藍(lán)圖或模板。它定義了一組屬性和方法,用于描述對象的行為和狀態(tài)。通過定義一個class,您可以創(chuàng)建多個具有相同屬性和方法的對象。


          以下是關(guān)于Python中的class的詳細(xì)講解:


          定義一個class: 使用 class 關(guān)鍵字來定義一個class,并指定class的名稱。類名通常使用首字母大寫的駝峰命名法。


          class MyClass:

          # 類的定義

          pass

          實例化對象: 通過調(diào)用類來創(chuàng)建對象的過程稱為實例化。實例化一個類會調(diào)用類的 __init__ 方法,對對象進行初始化。


          obj = MyClass() # 創(chuàng)建一個MyClass的對象 obj

          構(gòu)造方法: 構(gòu)造方法( __init__ )是在實例化對象時自動調(diào)用的特殊方法。它用于初始化對象的屬性。


          class MyClass:

          def __init__(self, arg1, arg2):

          self.arg1 = arg1

          self.arg2 = arg2

          實例屬性和方法: 類定義中定義的屬性和方法稱為實例屬性和實例方法。實例屬性是每個對象特有的屬性,可以通過 self 關(guān)鍵字來訪問。實例方法是與實例對象相關(guān)聯(lián)的函數(shù),可以通過實例對象進行調(diào)用。


          class MyClass:

          def __init__(self, arg1):

          self.arg1 = arg1


          def instance_method(self):

          print(self.arg1)


          obj = MyClass("Hello")

          obj.instance_method() # 輸出 "Hello"

          類屬性和類方法: 類屬性是與類關(guān)聯(lián)的屬性,它們在所有實例之間共享。類屬性可以直接通過類名訪問。類方法是與類關(guān)聯(lián)的方法,而不是實例,它可以訪問類屬性并進行操作。


          class MyClass:

          class_attr = "Hello"


          @classmethod

          def class_method(cls):

          print(cls.class_attr)


          MyClass.class_method() # 輸出 "Hello"

          繼承: 繼承是一種創(chuàng)建新類的方法,它通過繼承現(xiàn)有類的屬性和方法來擴展新類。子類繼承父類的所有屬性和方法,并可以添加新的屬性和方法。


          class ParentClass:

          def parent_method(self):

          print("Parent method")


          class ChildClass(ParentClass):

          def child_method(self):

          print("Child method")


          obj = ChildClass()

          obj.parent_method() # 輸出 "Parent method"

          obj.child_method() # 輸出 "Child method"

          封裝和訪問控制: Python中沒有嚴(yán)格的訪問控制機制,但可以通過約定來實現(xiàn)封裝。通常,私有屬性和方法會用一個下劃線開頭 _ 表示,表示它們應(yīng)該被視為私有的,并且不應(yīng)該在類的外部直接訪問。


          class MyClass:

          def __init__(self):

          self._private_attr = "Private attribute"


          def _private_method(self):

          print("Private method")


          def public_method(self):

          print(self._private_attr)

          self._private_method()


          obj = MyClass()

          obj.public_method() # 輸出 "Private attribute" 和 "Private method"


          這些是Python中class的基本概念和用法。通過使用class,可以更好地組織代碼,提高代碼的可讀性和可維護性,使其更符合面向?qū)ο蟮木幊谭妒健?/p>


          主站蜘蛛池模板: 亚洲一区二区三区高清视频| 日本精品一区二区三区视频| 国产一区二区三区韩国女主播| 国产精品一区二区无线| 偷拍激情视频一区二区三区| 久夜色精品国产一区二区三区 | 无码人妻一区二区三区免费视频 | 日韩av片无码一区二区不卡电影 | 一区二区免费视频| 亚洲国产精品一区二区第四页 | 一区二区三区在线看| 久久久无码精品人妻一区| 一区二区三区四区视频| 国产丝袜视频一区二区三区| 国产精品第一区第27页| 国产一区在线观看免费| 精品国产区一区二区三区在线观看 | 精品国产一区二区三区www| 亚洲A∨精品一区二区三区下载| 亚洲国产精品乱码一区二区| 亚洲色婷婷一区二区三区| 久久久久久综合一区中文字幕 | 亚洲第一区二区快射影院| 国语精品一区二区三区| 不卡一区二区在线| 亚洲国产精品一区二区九九| 无码人妻精品一区二区三区99仓本| 日本人的色道www免费一区 | 日韩精品乱码AV一区二区| 国产激情一区二区三区 | 日本一区午夜爱爱| 国产一区二区三区电影| 无码人妻av一区二区三区蜜臀| 国产精品夜色一区二区三区| 无码视频一区二区三区在线观看| 四虎成人精品一区二区免费网站| 在线观看免费视频一区| 一区二区三区无码视频免费福利| 久久精品中文字幕一区| 国产福利一区二区在线视频 | 色欲AV蜜臀一区二区三区|