2012-02-16 49 views
4

我已經完成了一些閱讀,並且無法完全按照我的意願去理解它。我正在一點點「選擇自己的冒險」,從LPTHW教程遊戲,以下是完整的腳本:http://codepad.org/YWVUlHnU__init__的用途

什麼我不明白的是:

class Game(object): 

    def __init__(self, start): 
     self.quips = [ 
      "You died. Please try again.", 
      "You lost, better luck next time.", 
      "Things didn't work out well. You'll need to start over." 
      "You might need to improve your skills. Try again." 
     ] 
     self.start = start 

我明白咱」重新創建一個類,但爲什麼定義__init__?後來我做了一些像print self.quis[randint(0, len(self.quips)-1)]這樣的打印quips中四個字符串之一的東西,但爲什麼我不會創建一個叫做quips的函數呢?

回答

15

當調用Game("central_corridor"),創建一個新的對象和Game.__init__()方法被稱爲與該新對象作爲第一個參數(self)和"central_corridor"作爲第二個參數。由於您寫了a_game = Game(...),因此您已分配a_game來引用該新對象。

這個圖形可以使這個過程更容易理解:

Python object creation

注:由Python的提供__new__方法。它創建了作爲第一個參數給出的類的新對象。內置的__new__方法對剩餘的參數不做任何處理。如果需要,可以覆蓋__new__方法並利用其他參數。

實踐理性__init__()存在於你的程序設置在你創建(你叫a_game之一)的Game實例start屬性,以便於第一次調用在你想要的位置a_game.play()開始。

你說得對quips。沒有理由在__init__()中設置quips。你可以只讓一個類屬性:

class Game(object): 
    quips = ["You died. Please try again.", 
      "You lost, better luck next time.", 
      "Things didn't work out well. You'll need to start over." 
      "You might need to improve your skills. Try again." ] 
    def __init__(self, start): 
     self.start = start 
+0

我想如果我創建了「Game」類的實例,我使用的任何屬性都將決定遊戲的開始位置。因此,如果我想通過在遊戲類中的'laser_weapon_armory'函數開始遊戲,我會做'a_game = game(「laser_weapon_armory」)'然後''a_game.play()'。 '__init__'與這個有什麼關係? – ZCJ 2012-02-16 21:06:45

+0

__init__方法設置對象的基本狀態......想象一下,如果需要先連接到數據庫並首先下載一些數據以準備好自己,那麼在做其他事情之前,您應該在__init__中執行此操作。這就像是要從經銷商處購買汽車......沒有__init__,你會得到一個沒有車輪,沒有引擎的汽車物體,但如果你願意,你仍然可以car.drive()。 – michaelfilms 2012-02-16 21:25:20

+1

@ZCJ當你寫'Game(「laser_weapon_armory」)'時,實際發生的是一個新的'Game'實例被創建,我們稱它爲'obj'(它現在真的沒有名字),然後Python _automatically_運行'Game .__ init __(obj,「laser_weapon_armory」)'並返回'obj'(你最終分配給名字'a_game')。 '__init__'將'obj.start'設置爲''laser_weapon_armory「''。當你運行'a_game.play()'時,實際發生的事情是Python正在運行'Game.play(a_game)''self'參數被'a_game'填充,所以'self.start'是''laser_weapon_armory 「'當你調用'a_game.play()'時。 – 2012-02-16 21:52:10

1

__init__作爲構造函數在這裏。所以當遊戲實例創建時,調用__init__方法。如果您定義了另一種方法來設置調查,則必須明確調用它。

+0

嚴格地說,'__new__'是構造和'__init__'是「initializator」。 – glglgl 2013-09-28 09:06:36

5

更廣泛地說__init__和Python類的不太知名的,往往更危險__new__方法有做初始化的對象的狀態的工作。

對於您的特定對象,它並不是真正必要的,我想有很多非常簡單的數據存儲類可以認爲是不需要初始化的,但使用python進行更深層次編程的實際情況是,幾乎每一個複雜類需要初始化爲其基本狀態。

另外很大的原因就是讓你的類多用途:

class Foo(object): 
    def __init__(self, word_of_power="Ni"): 
     self.fact = "We are the knights who say %!" % word_of_power 

>>> f = Foo() 
>>> w = Foo("No!") 
>>> print f.fact 
"We are the knights who say Ni!" 
>>> print w.fact 
"We are the knights who say No!" 
+0

通過「多用途」,你的意思是我可以使用這個類來創建像Foo()這樣的實例,以及具有像Foo(「No!」)這樣的屬性的實例嗎?你是說,使其多用途的好處是,這兩個都可以工作? – ZCJ 2012-02-16 22:22:13

+0

@ZCJ,爲了保持術語的正確性,請注意,在Foo(「No!」)語句中,「No!」不是「屬性」。這是一個_argument_,它和任何函數的參數一樣。事實上,將'Foo'想象成一種特殊的函數會帶來一些幫助,它會接收一些參數並返回一個'Foo'類型的對象。 'self.fact',另一方面,_is_屬性。 – senderle 2012-02-16 22:41:49

+0

好的,非常感謝您的澄清 - 錘擊術語是我正在努力的。因此,在你的響應中'w.fact'是一個屬性,但是當變量'f'和'w'分配給'foo'的不同實例時,'foo'可以在括號內引用一個參數,因爲類允許它。聽起來對嗎? – ZCJ 2012-02-16 23:00:25