你来做一个游戏
到处都是class!!!
class意如其名,类。
类是对现实世界物体的抽象。
如,张三是一个人,李四也是一个人,小黄是一条狗。
这里的张三和李四有什么共同点呢?他们都是人,他们都是高级动物,他们都有思想,所以他们可以抽象成一个或多个类,名字叫人类,你也可以叫高级动物、有思想的动物等等,看你怎么去抽象它,即要如何对他们进行分类,小黄是条狗,狗是一类动物,狗也可以抽象成一个类,还可以更高的抽象成动物、四条腿的动物,吃屎的动物。。。所以类就是对个体的共同特征进行抽象,他们有什么共同的特征,有什么共同的动作。
python中如何定义、使用类
直接看例子,依然为每句代码添加注释
#定义一个名叫TheThing的类
class TheThing(object):
#在TheThing类中定义一个叫__init__的方法,有一个叫self的参数
def __init__(self):
#为self的成员变量赋值为0
self.number = 0
#定义TheThing类的第二个方法,也有一个self参数
def some_function(self):
#打印一句话
print "I got called."
#定义TheThing类的第三个方法,除self参数外,还有一个额外的more参数
def add_me_up(self, more):
#self成员变量number做加法
self.number += more
#此方法返回self的成员变量number
return self.number
#类的实例化,如TheThing是一条狗类,则生成狗a和狗b
a = TheThing()
b = TheThing()
#对象调用类中的函数
a.some_function()
b.some_function()
#对象调用类中的函数后输出到屏幕
print a.add_me_up(20)
print a.add_me_up(20)
print b.add_me_up(30)
print b.add_me_up(30)
#输出两条狗的number
print a.number
print b.number
先根据代码分析一下屏幕上会输出啥,然后再运行代码看实际输出是否与预估一致。
以上例子中有三个梗要注意
1.python中类的定义
class是python中的关键字,类使用class开头来进行定义,class后跟着类名,注意类名的命名方式,变量的命名方式有各种不同的风格,但建议至始至终使用一种统一的命名方式,如驼峰式命名规则,类名要有意义,单词首字母大写,类名后面紧跟括号,括号里面是object,官方文档这样说object是所有类的基类。
object is a base for all new style classes. It has the methods that are common to all instances of new style classes.
实际上TheThing类的写法是类的继承,TheThing是子类,object是父类。可以通过以下语句查看TheThing的父类
print TheThing.class.base
类是面向对象编程中引入的概念,类之间也可以存在关系,父类、子类,他们通过继承实现。
子类继承了父类,即子类拥有了父类的成员变量,包括属性和方法。
类体与方法定义类似,需要整体缩进一边python确定类的边界。
python中有许多内置的类,可以直接使用,如str,list,dict都是类。
面向对象编程也是可以继续深挖的梗。
对象的生命周期也是可以深挖的梗。
挖、挖、挖,好的程序员是一个挖矿工。
2.init方法
上面提到的对象的生命周期就与init有关,这个函数是对象的构造器,在它里面实现对象成员的初始化,生成对象时的任何参数都会被init接收,比如如果我们调用 x = SomeClass(10, 'foo')),那么 init 将会得到两个参数10和foo。
实际上init并不是对象生成时被调用的第一个函数,而是new方法,python根据new的返回值决定是否调用init方法
如果说new和init是对象的构造器的话,那么del就是对象的析构器,它定义的是当一个对象进行垃圾回收时候的行为。当一个对象在删除的时需要更多的清洁工作的时候此方法会很有用,比如套接字对象或者是文件对象。注意,如果解释器退出的时候对象还存存在,就不能保证 del 能够被执行.
from os.path import join
class FileObject:
'''给文件对象进行包装从而确认在删除时文件流关闭'''
def __init__(self, filepath='~', filename='sample.txt'):
#读写模式打开一个文件
self.file = open(join(filepath, filename), 'r+')
def __del__(self):
self.file.close()
del self.file
3.self参数
python的self参数相当于C++的this指针,但C++中由编译器隐式指定,用户不用关心,python的设计理念是:显式好于隐式。
如
class X:
def func(self,a,b):
pass
obj = X('a','b')
调用X类中的方法
obj.func('a','b')
相当于
X.func(obj,'a','b')
试着将上节中的游戏封装到一个类中
游戏中包含6个函数
death
escape_pod
the_bridge
laser_weapon_armory
central_corridor
runner
一个字典数据
ROOMS
将以上属性抽象成一个Game类
#coding:utf-8
from sys import exit
from random import randint
class Game(object):
def __init__(self, place):
self.start = place
self.ROOMS = {
'death':self.death,
'central_corridor':self.central_corridor,
'laser_weapon_armory':self.laser_weapon_armory,
'the_bridge':self.the_bridge,
'escape_pod':self.escape_pod
}
def death(self):
quips = ["你死了。你在这有点糟糕","干得漂亮,你死了,愚蠢的人类","失败者","我有只小狗很擅长这个"]
print quips[randint(0,len(quips)-1)]
exit(1)
def central_corridor(self):
print "来自Percal25号行星的哥顿人入侵并破坏了你的飞船"
print "你的全体船员已经阵亡,你是最后的幸存者"
print "任务是从武器库中拿到中子自毁炸弹"
print "把它放在舰桥上,在你进入一个。。后炸毁飞船"
print "逃生仓"
print "\n"
print "你正奔跑在中央走廊到武器库的路上"
print "这时一个哥顿人跳出来,红皮肤,黑牙齿,邪恶的服装"
print "怨恨充斥着他的身体,他正在挡在武器库的门外,好像正准备扔出炸弹炸死你"
action = raw_input("> ")
if action == "shoot!":
print "快速拔出你的枪并朝哥顿人开火"
print "他灵活的移动让你失去了目标,你的激光枪击中了他的服装,这"
print "让他整个燃烧起来"
print "这让他非常愤怒,不停的揍你的脸,直到"
print "你死了,然后他吃了你"
return "death"
elif action == "dodge!":
print "像一个世界级拳击手,你躲闪"
print "哥顿人的枪射穿了你的头,然后把你吃了"
return "death"
elif action == "tell a joke":
print "哥顿人喜欢听笑话"
print "你给他讲了个非常搞笑的笑话,趁他不注意,你爆了他的头"
print "穿过了武器库的门"
return "laser_weapon_armory"
else:
print "别想了"
return 'central_corridor'
def laser_weapon_armory(self):
print "你打了个洞进入武器库"
print "这里死静死静的,好像埋伏着好多哥顿人"
print "你发现了中子炸弹,但是它被密码锁锁着"
print "你需要代码才能打开"
print "如果输错10次,密码锁将永远锁着"
print "提示:代码是3个数字"
code = "%d%d%d" % (randint(1,9),randint(1,9),randint(1,9))
print code
guess = raw_input("[keypad]> ")
guesses = 0
while guess != code and guesses < 10:
print "BZZZZEDDD!"
guesses += 1
guess = raw_input("[keypad]> ")
if guess == code:
print "锁打开了,飘荡出白色的气体"
print "你带着中子弹跑得越来越快"
print "你必须把中子弹放在舰桥正确的位置"
return "the_bridge"
else:
print "你最后一次听到了滴滴声"
print "锁永久锁定了"
print "你决定静静的坐着,最终哥顿人炸掉了飞船,你挂了"
return "death"
def the_bridge(self):
print "你带着中子弹突然出现在舰桥"
print "惊动了5个哥顿人"
print "他们正试图控制飞船,他们每个人都穿着一套丑陋的服装"
print "他们还没有拿出武器,因为他们看到你手上正拿着一个已经启动的炸弹,他们不想看着它爆炸"
action = raw_input("> ")
if action == "throw the bomb":
print "恐慌中,你把炸弹扔向了哥顿人"
print "这时一个哥顿人从背后把你射杀,你倒地的时候看见一个哥顿人正在解除炸弹"
return "death"
elif action == "slowly place the bomb":
print "你指着手中的炸弹,哥顿人被吓到了,他们举起手开始惊慌,"
print "你慢慢地移动到门口,小心的把炸弹放到地上"
print "你把门锁住,哥顿人出不来。炸弹放置好了,你跑向逃生仓"
return "escape_pod"
else:
print "DOES NOT COMPUTE"
return "the_bridge"
def escape_pod(self):
print "你冲向逃生仓,争取整个船爆炸前,"
print "似乎船上没有其他哥顿人,你一路很顺利"
print "你来到逃生仓,这里有5个仓位,你要选择一个"
print "你选择哪一个?"
good_pod = randint(1, 5)
print good_pod
guess = raw_input("[pod #]> ")
if not guess.isdigit():
print "please input a number"
self.escape_pod()
if int(guess) != good_pod:
print "你跳进 %s 号逃生仓,按下了弹出按钮" % guess
print "逃生仓发生了爆炸"
print "你挂了"
return "death"
else:
print "你跳进 %s 号逃生仓,按下了弹出按钮" % guess
print "你赢了"
exit(0)
def runner(self):
next = self.start
while True:
room = self.ROOMS[next]
print "\n-----------"
next = room()
g = Game('central_corridor')
g.runner()