函数与类非常不同。看起来你接受了一个函数,只是def
将class
. 我想这主要适用于你的情况,但这不是课程应该如何进行的。
类包含函数(方法)和数据。例如,你有一个球:
class Ball(object):
# __init__ is a special method called whenever you try to make
# an instance of a class. As you heard, it initializes the object.
# Here, we'll initialize some of the data.
def __init__(self):
# Let's add some data to the [instance of the] class.
self.position = (100, 100)
self.velocity = (0, 0)
# We can also add our own functions. When our ball bounces,
# its vertical velocity will be negated. (no gravity here!)
def bounce(self):
self.velocity = (self.velocity[0], -self.velocity[1])
现在我们有一Ball
堂课。我们如何使用它?
>>> ball1 = Ball()
>>> ball1
<Ball object at ...>
它看起来不是很有用。数据可能有用:
>>> ball1.position
(100, 100)
>>> ball1.velocity
(0, 0)
>>> ball1.position = (200, 100)
>>> ball1.position
(200, 100)
好吧,很酷,但是与全局变量相比有什么优势?如果您有另一个Ball
实例,它将保持独立:
>>> ball2 = Ball()
>>> ball2.velocity = (5, 10)
>>> ball2.position
(100, 100)
>>> ball2.velocity
(5, 10)
并且ball1
保持独立:
>>> ball1.velocity
(0, 0)
现在bounce
我们定义的那个方法(类中的函数)呢?
>>> ball2.bounce()
>>> ball2.velocity
(5, -10)
该bounce
方法导致它修改velocity
自己的数据。再一次,ball1
没有被感动:
>>> ball1.velocity
应用
一个球是整洁的,但大多数人并没有模拟这一点。你在做游戏。让我们想想我们有什么样的东西:
所以让我们开个房间吧。房间有名字,所以我们会有一些数据来存储它:
class Room(object):
# Note that we're taking an argument besides self, here.
def __init__(self, name):
self.name = name # Set the room's name to the name we got.
让我们举个例子:
>>> white_room = Room("White Room")
>>> white_room.name
'White Room'
漂亮。但是,如果您希望不同的房间具有不同的功能,那么这并不是那么有用,所以让我们创建一个子类。子类从其超类继承所有功能,但您可以添加更多功能或覆盖超类的功能。
让我们考虑一下我们想要对房间做什么:
我们想与房间互动。
我们如何做到这一点?
用户输入一行得到响应的文本。
它的响应方式取决于房间,所以让我们用一个名为的方法来处理房间interact
:
class WhiteRoom(Room): # A white room is a kind of room.
def __init__(self):
# All white rooms have names of 'White Room'.
self.name = 'White Room'
def interact(self, line):
if 'test' in line:
print "'Test' to you, too!"
现在让我们尝试与之交互:
>>> white_room = WhiteRoom() # WhiteRoom's __init__ doesn't take an argument (even though its superclass's __init__ does; we overrode the superclass's __init__)
>>> white_room.interact('test')
'Test' to you, too!
您最初的示例以在房间之间移动为特色。让我们使用一个名为的全局变量current_room
来跟踪我们所在的房间。1让我们也制作一个红色房间。
1. 这里除了全局变量之外还有更好的选择,但为了简单起见,我将使用一个。
class RedRoom(Room): # A red room is also a kind of room.
def __init__(self):
self.name = 'Red Room'
def interact(self, line):
global current_room, white_room
if 'white' in line:
# We could create a new WhiteRoom, but then it
# would lose its data (if it had any) after moving
# out of it and into it again.
current_room = white_room
现在让我们试试:
>>> red_room = RedRoom()
>>> current_room = red_room
>>> current_room.name
'Red Room'
>>> current_room.interact('go to white room')
>>> current_room.name
'White Room'
读者练习:WhiteRoom
在's中添加代码interact
,让您回到红色房间。
现在我们已经一切正常,让我们把它们放在一起。有了我们name
所有房间的新数据,我们还可以在提示中显示当前房间!
def play_game():
global current_room
while True:
line = raw_input(current_room.name + '> ')
current_room.interact(line)
您可能还想创建一个函数来重置游戏:
def reset_game():
global current_room, white_room, red_room
white_room = WhiteRoom()
red_room = RedRoom()
current_room = white_room
将所有类定义和这些函数放入一个文件中,您可以像这样在提示符下播放它(假设它们在 中mygame.py
):
>>> import mygame
>>> mygame.reset_game()
>>> mygame.play_game()
White Room> test
'Test' to you, too!
White Room> go to red room
Red Room> go to white room
White Room>
为了能够通过运行 Python 脚本来玩游戏,您可以在底部添加:
def main():
reset_game()
play_game()
if __name__ == '__main__': # If we're running as a script...
main()
这是对课程的基本介绍以及如何将其应用于您的情况。