__init__的目的

时间:2012-02-16 20:43:21

标签: python init

我已经完成了一些阅读,并且无法像我想的那样完全掌握这一点。我正在从LPTHW教程中做一些“选择你自己的冒险”游戏,这里是完整的脚本:http://codepad.org/YWVUlHnU

我不明白的是:

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的函数呢?

3 个答案:

答案 0 :(得分:15)

当您调用Game("central_corridor")时,会创建一个新对象,并调用Game.__init__()方法,并将该新对象作为第一个参数(self)和"central_corridor"作为第二个论点。自您撰写a_game = Game(...)以来,您已指定a_game来引用该新对象。

此图形可能使过程更容易理解:

Python object creation

注意:__new__方法由Python提供。它创建了作为第一个参数给出的类的新对象。内置的__new__方法对剩余的参数没有任何作用。如果需要,可以覆盖__new__方法并使用其他参数。

您的程序中存在__init__()的实际原因是在您创建的start实例(您称之为Game的实例)上设置a_game属性,以便第一个拨打a_game.play()的电话会在您希望的位置开始。

你对quips是正确的。没有理由在quips中设置__init__()。你可以把它变成一个类属性:

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

答案 1 :(得分:5)

更广泛地__init__以及python类的鲜为人知且通常更危险的__new__方法可用于初始化对象的状态。

对于你的特定对象,它并不是真正必要的,我想有很多非常简单的数据存储类你可以想到不需要初始化,但是使用python进行更深入编程的现实实际上是更复杂的class需要初始化为其基本状态。

另外,最重要的原因是让你的课程多用途:

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!"

答案 2 :(得分:1)

__init__在这里作为构造函数。因此,在创建游戏实例时,将调用__init__方法。如果您定义另一种设置 quips 的方法,则必须明确调用它。