我已经完成了一些阅读,并且无法像我想的那样完全掌握这一点。我正在从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
的函数呢?
答案 0 :(得分:15)
当您调用Game("central_corridor")
时,会创建一个新对象,并调用Game.__init__()
方法,并将该新对象作为第一个参数(self
)和"central_corridor"
作为第二个论点。自您撰写a_game = Game(...)
以来,您已指定a_game
来引用该新对象。
此图形可能使过程更容易理解:
注意:__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 的方法,则必须明确调用它。