秒懂Python类

您所在的位置:网站首页 用python写的大型游戏 秒懂Python类

秒懂Python类

2023-04-10 22:37| 来源: 网络整理| 查看: 265

欢迎来到美术老师的Python课!

Good morning class!今天我们来聊一聊class!

初学Python时,class困扰了我很久,几个基本概念不大好理解。

看了各种教程,不是拿Java举例就是拿数学举例,对文科生很不友好。如果你也有同感,不妨试试我这个版本。

如果看了5分钟你还理解不了class,你就可以不用学Python了。

入门CLASS,主要就是5个概念:类、实例、方法、_init_、self.

什么是类?

类就是class,class就是模板。

简单粗暴可以理解为类似PPT模板。

什么是实例?

实例就是拿模板做出来的东西。

类似于你拿PPT模板做了一个自己的PPT,这个PPT就是一个实例。

什么是方法?

所谓的方法其实就是『功能』的意思。

故弄玄虚。写在『类』内部的『函数』就叫方法。

从 def _init_(self) 开始就有点不好理解了。

它其实就是类的一个方法,只不过它比较特殊,特殊在必须得有。

因为它的功能就是初始化。

至于什么是『初始化』,懂的人一眼就明白了,不懂的人,不举个傻白甜的例子很难理解透彻,比如一周前的我。

而这些概念里面最不好理解的就是self。

至少对我来说是。

你不妨把self理解为"宝宝"。

每个孩子的名字各不相同。但是当他们回到家里的时候,父母都叫他们『宝宝』。

self就是实例在类里面的昵称。

光知道概念其实是没用的,我们要用起来,才能真正理解它们之间的关系。

我们拿做高达举个例子:

我现在要设计一种新型武器,这种武器是以前从来没有出现过的类型,它有几个特点,是大型人形机器人,由人类驾驶员操作,可以飞,可以实施攻击动作。我把它取名叫高达。

高达就是一个典型的类。

如果用Python语言把上面描述的内容写下来就是这样 :

class Gundam(): # 把这个类名字定义为高达 def fly(self): # 添加飞行功能 self.power -= 10 # 设定每飞行一次掉10份能量,但总能量数没有做设定。 print(self.name, "消耗了10%的能量向上飞了10米。能量还剩", self.power, "%请谨慎使用!") def shoot(self): # 添加射击功能 self.bullet -= 10 # 设定每发射一次,消耗10枚子弹,总子弹数没有设定。 print(self.name, "发射了10枚飞弹!全脱靶!剩余飞弹", self.bullet, "枚,败家玩意你省着点打!")

以上这段代码,就是一个简单的高达模板。

但是这个模板其实是不完整的,因为这个高达是需要驾驶员的。

所以我们要给驾驶员做一个座舱和“方向盘”,好让他来驾驶高达。

下面这段代码就是所谓的“驾驶舱”:

# 通过__init__()这个函数,给整个类传入了四个函数。 # pilot(驾驶员), name(机体名字), power(能量总数), bullet(子弹总数) def __init__(self, pilot, name, power, bullet): # 以下就是初始化的过程,把输入的参数与模板匹配,并输出一些说明性的反馈。 self.pilot = pilot self.name = name self.power = power self.bullet = bullet print("驾驶员【", self.pilot, "】已注册!本机体命名为【", self.name, "】!") print(self.name, "动力系统已启动!剩余动力", self.power) print(self.name, "武器系统已启动!剩余飞弹", self.bullet)

当驾驶员"阿姆罗"第一次进入驾驶舱启动这台机器时,机器会要求他输入四个信息:

pilot(驾驶员), name(机体名字), power(能量总数), bullet(子弹总数)

当他把这四样信息输进去之后,系统就会做一系列初始化运行,启动动力系统,启动传动系统,启动电控系统,注册驾驶员是阿姆罗等等。

完成这一系列的操作后,这台高达就被实例化了。 这个类的完整代码如下:

class Gundam(): def __init__(self, pilot, name, power, bullet): self.pilot = pilot self.name = name self.power = power self.bullet = bullet print("驾驶员【", self.pilot, "】已注册!本机体命名为【", self.name, "】!") print(self.name, "动力系统已启动!剩余动力", self.power) print(self.name, "武器系统已启动!剩余飞弹", self.bullet) def fly(self): self.power -= 10 print(self.name, "消耗了10%的能量向上飞了10米。能量还剩", self.power, "%请谨慎使用!") def shoot(self): self.bullet -= 10 print(self.name, "发射了10枚飞弹!全脱靶!剩余飞弹", self.bullet, "枚,败家玩意你省着点打!")

具体的实例化操作如下:

G1 = Gundam("阿姆罗","白色死神",100,100)

运行以上这段代码,就会得到以下输出:

驾驶员【 阿姆罗 】已注册!本机体命名为【 白色死神 】! 白色死神 动力系统已启动!剩余动力 100 白色死神 武器系统已启动!剩余飞弹 100

现在,G1就是一个高达的实例,它的驾驶员是阿姆罗,它的名字叫白色死神,它的动力是100,子弹也是100. 你可以直接查询G1的相关参数:

# 输入: G1.name,G1.power # 输出: ('白色死神', 100)

如果你想让它飞起来,或者发起攻击,就要用到方法了。

# 输入: G1.fly() 输出: 白色死神 消耗了10%的能量向上飞了10米。能量还剩 90 %请谨慎使用! # 输入: G1.shoot() # 输出: 白色死神 发射了10枚飞弹!全脱靶!剩余飞弹 90 枚,败家玩意你省着点打!

现在基本上能明白什么是类了吧?

类,就是高达设计图。

实例,就是根据设计图做的实体高达。

方法,就是高达的功能。

def _init_ ( ) 方法,它的括弧就是高达的驾驶舱,只要一有驾驶员进去,它就启动高达,高达就变成实例了。

self,恩……好像self还是不好理解,要理解self还得多整几台高达出来。

我们先给这台高达升个级,在原有的性能基础上加一个新技能,光剑捅座舱。这就要用到所谓的类继承。

因为我现在是第二代开发者,我不用研究高达是怎做的了,只要在原来的类上面做点创新就行了。

class GundamPlus(Gundam): # 括弧里放个Gundam意思是这个类继承了Gundam的所有特性。 def __init__(self,pilot,name,power,bullet): self.pilot = pilot self.name = name self.power = power self.bullet = bullet print("驾驶员【",self.pilot,"】已注册!本机体命名为【",self.name,"】!") print(self.name,"动力系统已启动!剩余动力",self.power) print(self.name,"武器系统已启动!剩余飞弹",self.bullet) print('暴击已达100%!光剑技能可释放!') def lightSaber(self): self.power -= 30 print('光剑已捅向对方驾驶舱……') print('对方驾驶舱已捅炸!造成60点伤害!消耗能量30,剩余能量:',self.power) return 60 # 造成的攻击

我创造了一个新的类,GundamPlus,并且给了它一个新的方法,lightSaber( ),使用它就会消耗30的能量,造成60的伤害。大招无疑了。

我们把这个新类实例化一下:

# 输入: G1 = GundamPlus("阿姆罗","白色死神",power = 100,bullet = 100) # 输出: 驾驶员【 阿姆罗 】已注册!本机体命名为【 白色死神 】! 白色死神 动力系统已启动!剩余动力 100 白色死神 武器系统已启动!剩余飞弹 100 暴击已达100%!光剑技能可释放!

虽然这个类里面没有写飞行和设计方法,但是因为它继承了Gundam的所有属性,所以它依然有这些功能。我们让他发个连招看看:

# 输入: G1.shoot(),G1.fly(),G1.lightSaber() # 输出: 白色死神 发射了10枚飞弹!全脱靶!剩余飞弹 80 枚,败家玩意你省着点打! 白色死神 消耗了10%的能量向上飞了10米。能量还剩 80 %请谨慎使用! 光剑已捅向对方驾驶舱…… 对方驾驶舱已捅炸!造成60点伤害!消耗能量30,剩余能量: 50

有点厉害吧? 我们给它找一个对战伙伴吧!

我们再以最早的高达蓝图作为基础设计一个扎古好了。给它一些独特的新设定,耐力比高达更弱,但是开大后杀伤力比高达强,并且有独占必杀技。

class Zaku(Gundam): def __init__(self,pilot,name,power,bullet): self.pilot = pilot self.name = name self.power = power self.bullet = bullet print("驾驶员【",self.pilot,"】已注册!本机体命名为【",self.name,"】!") print(self.name,"动力系统已启动!剩余动力",self.power) print(self.name,"武器系统已启动!剩余飞弹",self.bullet) print('暴击已达100%!踢屁股技能可释放!') def assKick(self): self.power -= 40 print('进入狂暴状态……') print('绕后爆菊成功,对方已失去战意!造成70点伤害!消耗能量40,剩余能量:',self.power) return 70 # 造成的攻击

我们来试试扎古怎么样:

# 输入 Z1 = Zaku('夏亚','红色彗星',power = 120,bullet = 80) # 实例化扎古 # 输出: 驾驶员【 夏亚 】已注册!本机体命名为【 红色彗星 】! 红色彗星 动力系统已启动!剩余动力 120 红色彗星 武器系统已启动!剩余飞弹 80 暴击已达100%!踢屁股技能可释放! # 输入: Z1.shoot(),Z1.fly(),Z1.assKick() # 输出: 红色彗星 发射了10枚飞弹!全脱靶!剩余飞弹 60 枚,败家玩意你省着点打! 红色彗星 消耗了10%的能量向上飞了10米。能量还剩 100 %请谨慎使用! 进入狂暴状态…… 绕后爆菊成功,对方已失去战意!造成70点伤害!消耗能量40,剩余能量: 60

好,我们现在有了两台机甲,

现在终于要说self了!

当我们输入Z1.shoot( )的时候,代码开始执行,Z1这个实例很快发现,我妈Zaku家里没有.shoot( )这个方法呀,于是它就去找妈的妈,我的姥姥…耶!姥姥家果然有.shoot( )与此同时,它也发现自己的敌人G1也在姥姥家,他们姥姥都是Gundam。

姥姥说我的宝宝们别争了,人人有份!姥姥一人给发了一把枪:shoot(self)

self的存在就是为了在调用方法的时候具有适应性。如果要说的更形象一点的话,不管你姥姥有多少个孙子,只要你是她孙子,她包的饺子你就随便吃!孙子之间可能有矛盾有隔阂,但在姥姥眼里,这都是我孙子。

self就是实例在类里面的代称。姑且这么理解吧。

现在通透了没有?

接下来要说的也是最开始一直困扰我的一个问题:

为什么非要搞成类这么累?

我写完上面的教程后心想,反正都有一个高达一个扎古了,为什么不让他们干一架?

于是我就稍微加了点东西,把它变成了一个小游戏后。在编游戏的过程中我才彻底明白类的好处,或者说面向对象的好处在哪里。

因为在游戏里你要反复调用你的高达,如果每次都重写会很累,如果你把它们打包成一个类,你就可以把注意力专注在逻辑判断方面,可以极大的提高效率,而且可以让编写过程更加直观。

#!/usr/bin/env python # coding=utf-8 class Gundam(): def __init__(self,pilot,name,power,bullet): self.pilot = pilot self.name = name self.power = power self.bullet = bullet print("驾驶员【",self.pilot,"】已注册!本机体命名为【",self.name,"】!") print(self.name,"动力系统已启动!剩余动力",self.power) print(self.name,"武器系统已启动!剩余飞弹",self.bullet) def fly(self): self.power -= 10 print(self.name,"消耗了10%的能量向上飞了10米。能量还剩",self.power,"%请谨慎使用!") def shoot(self): self.bullet -= 10 print(self.name,"发射了10枚飞弹!全脱靶!剩余飞弹",self.bullet,"枚,败家玩意你省着点打!") # 这就是我们的Gundam这个类了。 # 接下来我想给两台机体各自加一些独特的功能。 # 要实现这些功能就要用到类的继承。我现在是第二代开发者,我现在不用研究高达是怎做的了,我要给它两个细分分类,一类叫高达+,一类叫扎古2。 # 高达+给一个特技,光剑捅座舱。扎古2给一个绕后踢屁股。 class GundamPlus(Gundam): def __init__(self,pilot,name,power,bullet): self.pilot = pilot self.name = name self.power = power self.bullet = bullet print("驾驶员【",self.pilot,"】已注册!本机体命名为【",self.name,"】!") print(self.name,"动力系统已启动!剩余动力",self.power) print(self.name,"武器系统已启动!剩余飞弹",self.bullet) print('暴击已达100%!光剑技能可释放!') def lightSaber(self): self.power -= 30 print('光剑已捅向对方驾驶舱……') print('对方驾驶舱已捅炸!造成60点伤害!消耗能量30,剩余能量:',self.power) return 60 # 造成的攻击 class Zaku(Gundam): def __init__(self,pilot,name,power,bullet): self.pilot = pilot self.name = name self.power = power self.bullet = bullet print("驾驶员【",self.pilot,"】已注册!本机体命名为【",self.name,"】!") print(self.name,"动力系统已启动!剩余动力",self.power) print(self.name,"武器系统已启动!剩余飞弹",self.bullet) print('暴击已达100%!踢屁股技能可释放!') def assKick(self): self.power -= 40 print('进入狂暴状态……') print('绕后爆菊成功,对方已失去战意!造成60点伤害!消耗能量40,剩余能量:',self.power) return 60 # 造成的攻击 #那么接下来我们把它们放到一个游戏里。游戏的基本逻辑是这样的: #你可以启动一台高达与扎古战斗。这是一个回合制的游戏,每次攻击之后看HP,谁的HP成了负数就输了。 import time def game(): print('【【【欢迎来到高达大战】】】') time.sleep(1) input(""" 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 11 11110 0111 1111 11 1111 1111111 111111. 11 1 1 111111111110 0111 1111 1 1111 111 11111 . 11111. 1 1 1 11 1110 0111 1111 1111 111 1111 1 1111. 0 1 1 111 1111 11 1111 1 1111 11 .111 111. 1 .0 1 111 1111111 111111 111 1111 1111 01111 11. 11 10 1 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111 .1111111111111111111111111111111111111111111 111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111111 11.111111111111111111111111111111111011 111.111111111111111111111111111111111.11 11111 11111111111111111111111111111.111 1 11111 1111111111111111111111111111111111.11111 11111110 01111111111111111111111111 111111 011 0 1111.111111111111111111111111110 1111111 1111111111 1111111111111111111111 111111 111 1 1111 011111111111111111111111 1111111111 111111111111. 1111111111111111110 11111 111 1111 111111111111 11111111 111111111111 111111111111111 1111111.1110 .1111 0111 1111 .11111111 111111111111111 111111111111111110 11111111 111111111111111 111 111111111 11111111111111111 11111111111111111111 111111111 1111111111111111 11 111111111 11111111111111111111 1111111111111111111111. 111111111 1111111111111 1111111111 01111111111111111111111 11111111111111111111 1111 11111111111111111111111111111 1 1111111111111111111111 1111111111111111111 111 1 11.11111111111111 11111. 1 .110111111111111111111111 11111111111111111 111 11 11110 0111111111111 01 1.11111111 11111111111111111 11111111111111 11111.1 01 11 11111110 011 1 1 11111 111111111111111111 1111111111111111 111 1 11 1 11 11111. . 11111011111111111111111 111111111111111 1111111 11 .0 11111111111111111111111111111111 1111111111111111 11111111 10 .1111111111 111111111 111111.1111111111 11111111111111111 11111 1. .1111111111111111001111 . . 1111111111 11111111111 1 111 . 1111111111111111111111 111 111111111111 11111111 11 1. 10 111111111111111111111110 111 11111111111 11111111 1111111 1111111 11111111111111111 11 1111111101111111 1111111 01 1 11111111. 011 .1111111 11.. 111 1111111 1111111 11 1111 111111 . 0111. 1 11111111 1111 111 1111111 1111111 111 111111.11 1 . 1111 011 . .1 1 1 111111111011111111 1111111 1111111 1. 111111 11.. 00 111111111 101 111 11111.11111 111 1111111 1111111 0 111100 11111111111111111111.1111111111111 11. 1111111 1111111 . . .. 11111111111111 1111111111111111 1111111 1111111 1 . . 0 .11111111111 1111111 11 1111111 1111111 1 0 . . 0111111111111 1111111 11111 11 1111111 1111111 1 0 1 11111111111101 1111111 011111110 1111111 1111111 1 1 1 .. .1 111111111 1111111 1111..111 1111111 1111111. 1 111 1 1 11 .1 111111 . 1111111. .0.111111111111 11111111 1 1 1 1 111 11111 1111111. 011111 11111111 111111111 1 1 1 11 111 11 1111111 11111111111111111 111111111111111 1 1 1 111 1 . 11111111 111111111111111 1111111111111111 1 1 111 1. 11011 1 01111111 1111111111111111 111111111111111111111111 111111 1 111111 1111111111111111111111111111111 1111111111111111111111111111111111111111 ..... 11111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 """) pilot = input('请输入驾驶员的名字:') name = input('请输入机体的名字:') time.sleep(1) print(""" 1 11 111 111 111 1111 .111. 01111 011111 1111 111111 11 1 11111 111111 111 1 011111 11111111111111111111111 111111100000 111111 111111100000 11111 1111111100000 11 111 11 111111..10 11111111 1 11111111.. 1111111. 11 11 1111 1111 11 . 11 111 111 1 11 .1111 0..111 ..111 . 111 .11111111 1111 1111 . .11 11111111 111 1111 1 1111111 111 1111 1111. 1 1111111 1 1111111111 11 11 11 11111111111. 1001011111 11 000 11. 1 11111111111 110111011 11. .1.1.0101.1 111 11111111111 10111101.1111111011000. 11111 11111111111 1.110111 101111011100 11111100 111111111 1. 1.101.1 . .011110 . 111111 ..1.1 111 1 1 . 1 1 1....11 1111 1 1.1 1 1 ...11 . 1111 .11111 1101 00 11. 1 10..1 .000010 1 11111 011 .1. 1111 1111110.11 . 11 . 011. 11111111.... 1111111111111 .111110..1 1 11 0. 11 1111 1110 11111 11 111 11111 ...1 1 11 11111111111111 01110.11 110 0 111 ..11 1 11 1 111111111111 11111111 010 1 .1. 1 00 0 111111111. 0 1111111... 1 . 0 11 0 00 1111 1 1111111. .1 . 0. 1111 11 1111111111 1 0 11 1 . 11. 11 11111 .11 1 1 11111111101 .1111 1111111 1 .11 1 .11111101111 11111111111 1 11 1 1 1111111.11111111 111111110 0 1 . 1 .111111110 0111111 . 1111 111 1 . 1 11111111.... 10 111 ...111111110 ..0.0........ 1 .....1111111110 000. .. . ......111100. .... 0...... """) gundam1 = GundamPlus(pilot,name,power = 100,bullet = 100) G_hp = 100 print(f"{gundam1.name}HP = 100 ") time.sleep(1) input(f'{pilot},你感觉怎么样?') time.sleep(1) print('天空中出现了一台敌机,敌机情报获取中……') time.sleep(1) print('……') time.sleep(1) print(""" .1 1 11 11 11 11 11. 011111111111111 111111111111111111 1 11111111111111111.11111 1 0. .1111111111111111111111 11 0 0. 10 .111 ..11111 .1 .11 11 1111 .111 111 011.101110 110 1.111111. .000.011 111111. .10111 11110 011 1..111111111111111111111111 111. 0 111111110. 11.1111011111111.111111111111.111 00000000 111111111110.. 1 111110.1111111111111111111111 1 111111111111111. ....... .00 01111 ....11111111 .111111111 .. 1111 111111 110. 11111 .111111111 011111111 111110 . ..1101.. 11 000 111111111 0111111110 111111 .....1111 11 0111 111111111 .11111111. 111111 .. .10 1 . 1111 111111111 111.00. 1111111 1 01111.. 111111111 0. .1 11111..11 . 111111111111111.. 11111111. 000 . .. 1110111 111111111.111 1111111 11111111 1111 ..10 .00110 01110111111111111.0 1111. 0 11111111 .111110 011. 1 101 1111 111111111 .111.111.1 11 0 1111111 01111111111. 110111 11100 1111111111.111. .0.111 11111 ..1 1110 01 . 0111111111111111.111111111. 111 .0 1111 .110 0111.01111.....1111111111 11111111111111110 . 0 0111111111 .01111111111 111111 111111111 . ..1111 .11111111 11.1111.01111111 111111 .0. .. .011111 1111110.111.01. 11111111. .. .01111111 . ...1 111111111 . ..0111111 0..000111. 1 11111 ...0. .. 1 0100001.. 1111. 1 010. ..0 0 10000111 .111 1111111 110. ..001.0111 1111 .111111110111 0 1000000111111111111111111 1111 111111111 111 011111111111 111100011111111101. 111 1111 ..1111 111111 . 1. 111 1111 1111 1011111111110.1 01111111111111 0 """) print('一场恶战在所难免!你准备好战斗了吗?') time.sleep(1) while True: def startgame(): mark1 = input('是否开始战斗?输入 Y 或者 N 选择!') if mark1 == 'Y': print('冲向天际吧!勇敢的高达!') time.sleep(1) return 1 elif mark1 == 'N': print('逃跑是没用的!你不干它,它就干你!') time.sleep(1) return 2 else: print('别闹,让你干啥你就干啥!') time.sleep(1) startgame() if startgame() == True: print('【【【GAME START!】】】') print(""" 对战字符画 """) time.sleep(1) mark2 = input('你要如何操作?a=起飞,b=射击,c=大招') if mark2 == 'a': gundam1.fly() elif mark2 == 'b': gundam1.shoot() elif mark2 == 'c': print(""" 11 111 1111 111111 11111 . 111111 10 11111 111110 1001 111110 1111110 10. 111111 1 11111011 110. 1111111 1 111110111011 11101 11111111 1 11 111 111111 1 11111 111111111 1. .0111 11111 11110 111111111 .1111111.111 111110 111111111000.... 11 11111111111 1111111110000.. 1 01111111111111 1 111111110000. 11.11111101111.11111 11 111111100000. 01111110 ..0.111100 1...1111 . 11.1111111000000. 11111111. 010011000 111 1 111111111 1111 011100000000. 01111. .111. 0010 .. 10. .. 1111011111111 11111 00. 11111111100.00.0010 1 1 111 . 0 11110111 1111 11111.. .11111111 .1 0010 1 . 0 1110 1 11111111 01111 111111110 1111111111 .1....0010 .. . 1 11101 1 1 11111111 1111111.111101111111111000 .1 0110 .. .11 1 11110 11 1111111111111111 1111111 0 .111 110. . .0011 1111. ..11111111 111100111001. .11111 .110 ..0 111101 1111111 111 11111.1111111 010111 . . 011100 11111111. 1111.00111101111111100.11111111 1110. 11111111 11 01. 11 0 1111111 111111111110 11110 1111111111111. .. .. 11111111111. .111101 111111111101111 0 1 . 1111111111000 .1111.0 11111111101111.1111 0000110011111111 111110.1 1111 1101111111.11..0.1111. .111111 111100 00 11 111111111111111111110 11111 11111.00 0. 111111111.11111011110 1111111 1111..11 010 01111. .1111111. 1111111 .1111... 0 111 0 111101. 111111 1111...10..1 1.11 001 1 10 11101 1111..00 1 1111111110 1 0. 111.11000000111 11111 1111111111111 01 1110. .000001111.111111 11111 11111111111111 11111110 . .00110111011111111 11111111111111011011 1 1 ...11.100 011111111 11111111111111111111111 1 11 . ..1110. .001111111 100111111111111111111100 1 ......1 0000. .010.. ..01111110 11.. 111111111.. 111111 1111111111 . . .1111111. 1 1 .0000.. 111111111.. 111 1........1 ...000 11111110. 1 0.11 10 .1110.. 0........1 . .11111 11. .1 111 1110..100. . ..011. ..1111111111 1111111111 1111110 ... .00 01111111 1111111111111 110 . 011... 1 1111111.1111. . 1 . 1 ........... 0 1111. 1 . ...... 0 1 0 0 .. . """) gundam1.lightSaber() Z_hp -= 60 print(f'【{zaku1.name} HP=',Z_hp,'】') time.sleep(1) if Z_hp


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3