1:python面向对象编程——类的设计与相互调用:以猜拳小游戏为例
Python已经学习了一段时间,这两天迫切的想知道,在面向对象编程过程中,类内部定义的各个函数之间的调用规则,一个类中使用另个类定义的方法该怎么处理。想找一个小Demo实现一下。正好看到这个剪刀石头布的猜拳小游戏,代码非常易于理解,就琢磨以这个程序为例,把遇到的这些问题梳理一下。原程序参考以下链接:
面向对象之人机猜拳小游戏
一、设计类的结构
原作者是按照以下顺序设计类的结构的:
1.1设计玩家类,电脑类,游戏game类
1.2玩家类player定义一个属性name和方法,出拳,1:石头 2:剪刀 3:布
1.3电脑类基本和玩家类基本一样,但是电脑出拳是随机产生1 2 3
1.4游戏类中包含玩家类和电脑类,定义一个游戏开始方法,调用玩家和电脑类出拳方法,判断游戏结果,谁赢了,把结果保存在一个电脑文件中
class Player:
def __init__(self,action):
self.name='玩家'
self.action=action
#定义函数来输出玩家的出拳方式
def Action(self):
if self.action == 1:
print(f'{self.name}出拳方式为:[石头]')
elif self.action==2:
print(f'{self.name}出拳方式为:[剪刀]')
elif self.action==3:
print(f'{self.name}出拳方式为:[布]')
class Computer:
def __init__(self):
self.name='电脑'
#定义一个函数获取电脑的出拳方式
def Action(self,random_num):
if random_num==1:
print('电脑出拳方式为:[石头]')
elif random_num==2:
print('电脑出拳方式为:[剪刀]')
elif random_num==3:
print('电脑出拳方式为:[布]')
显然,这样设计的类不够精炼,每个类都定义了一个Action,内容又非常的重复。可以将Action作为一个单独的类进行设计,输入玩家名、玩家动作的编号,就把“XX玩家的出拳方式为XX”给打印出来。
由于游戏玩家和电脑玩家的区别主要是name,其他功能一样,所以只需要用一个类来定义。
由此可以确定,首先设计两个类:
class Player(object)
def __init__(self,name):
self.name = name
class Action()
def __init__(self)
这里就遇到困惑已久的问题:一个类中需要调用另个一个类中定义的方法,该怎么办?
解决这个问题的方法,就是通过实例化一个类的对象,将这个对象作为参数传入另一个类,从而在另一个类中能够调用在此类中定义的方法。
自然的,这里就应该实例化一个动作,将这个动作参数传递给 Player和Computer,然后,再在类中调用Action定义的方法。
Action类,接受的是玩家名、玩家动作的编号。还需要定义动作编号和动作之间的对应关系,这里我们假设:1代表石头、2代表剪刀、3代表布,它之间的映射关系可以用zip函数实现,这样不需要像原程序那样用冗余的判断表达式了。实现代码如下:
def action_mapping(action):
identifier = [1,2,3]
actions = ['石头'