Python 知识量:10 - 41 - 150
继承是面向对象编程的高级特性之一,它提供了一种重用类的机制,使得可以在既有类的基础上创建新类。被继承的类通常称为基类,新创建的类称为派生类。两个具有直接继承关系的类又称为父类与子类。
下面设计一个玩家类Player,它具有两个属性:name和score:
# player.py class Player: def __init__(self,name=''): self.__name=name self.__score=0 def __str__(self): return "%s(%s)" % (self.__name,self.__score) def __repr__(self): return "Player %s" % str(self) def reset_score(self): self.__score=0 def add_score(self): self.__score=self.__score+1
定义完成后,可以这样使用:
>>> ===================== RESTART: D:/PythonTestFile/player.py ===================== >>> p=Player('Jeff') >>> p Player Jeff(0) >>> p.add_score() >>> p Player Jeff(1)
接下来定义两类玩家:人类玩家和计算机玩家。它们都具有玩家Player的特征,因此可以通过继承Player类来创建。
class Human(Player): pass #表示什么都不做 class Computer(Player): pass #表示什么都不做
创建人类玩家和计算机玩家对象:
>>> ===================== RESTART: D:/PythonTestFile/player.py ===================== >>> h=Human('Bob') >>> h Player Bob(0) >>> c=Computer('ID007') >>> c Player ID007(0)
因为类Human和Computer都继承自Player,因此可以直接使用Player中的属性和方法。
上节示例中,Human类和Computer类可以直接使用父类Player的方法,当调用__repr__(self)方法用于返回对象的官方表示时,使用的自然也是父类的方法,显示的是“Player...”。如果想要显示子类自己的官方表示内容,就需要重写有关方法。下面就重写Human类和Computer类的__repr__(self):
class Human(Player): def __repr__(self): return "Human %s" % str(self) class Computer(Player): def __repr__(self): return "Computer %s" % str(self)
再次运行结果为:
>>> ===================== RESTART: D:/PythonTestFile/player.py ===================== >>> h=Human('Bob') >>> h Human Bob(0) >>> c=Computer('ID007') >>> c Computer ID007(0)
多态也是面向对象编程的高级特性之一。它的主要含义是:不同的对象支持相同的方法,因此对于同一个方法调用,由不同的对象响应同一个命令,会产生不同的结果。
下面设计一个数字游戏,两个玩家各出一个整数(1~10),如果一人的数字比另一个人的小1,则获胜,否则为平手。
# player.py class Player: def __init__(self,name=''): self.__name=name self.__score=0 def __str__(self): return "%s(%s)" % (self.__name,self.__score) def __repr__(self): return "Player %s" % str(self) def reset_score(self): self.__score=0 def add_score(self): self.__score=self.__score+1 class Human(Player): def __repr__(self): return "Human %s" % str(self) def move(self): #Human类的游戏函数 while True: try: n=int(input("%s gives the value(1-10): " % self._Player__name)) if 1<=n<=10: return n else: print("Invalid value.") except: print("Error") class Computer(Player): def __repr__(self): return "Computer %s" % str(self) def move(self): #Computer类的游戏函数 import random return random.randint(1,10) def game(player1,player2): player1.reset_score() #重置得分 player2.reset_score() #重置得分 res1=player1.move() #玩家1出手 res2=player2.move() #玩家2出手 print("%s moved: %s" % (player1._Player__name,res1)) #显示玩家1的结果 print("%s moved: %s" % (player2._Player__name,res2)) #显示玩家2的结果 if res1==res2-1: player1.add_score() #玩家1获胜 return player1,player2, "%s wins." % player1._Player__name if res2==res1-1: player2.add_score() #玩家2获胜 return player1,player2, "%s wins." % player2._Player__name else: return player1,player2, "There is no winner here." #平手
以上代码简要分析如下:
上面分别定义了父类Player、子类Human和Computer、函数game()。
子类Human和Computer中都定义了函数move(),其功能是给出一个1-10的整数。Human类由输入获得;Computer类由随机函数产生。
函数game()需要两个参数,即两位玩家。这里将由类Human和Computer实例化的对象作为参数传递给函数game()。
函数game()调用对象参数的方法move()来实现数字的比较,得出胜负结果。这里方法move()的调用方式一样,由类Human和Computer实例化的对象参数自己负责具体响应,这种实现方式就是多态。
下面开始游戏:
>>> ===================== RESTART: D:/PythonTestFile/player.py ===================== >>> p=Human('Bob') >>> p Human Bob(0) >>> c=Computer('ID007') >>> c Computer ID007(0) >>> game(p,c) Bob gives the value(1-10): 8 Bob moved: 8 ID007 moved: 1 (Human Bob(0), Computer ID007(0), 'There is no winner here.') >>> game(p,c) Bob gives the value(1-10): 5 Bob moved: 5 ID007 moved: 4 (Human Bob(0), Computer ID007(1), 'ID007 wins.')
除了进行人与计算机的比赛外,还可以进行人与人、计算机与计算机之间的比赛:
>>> p1=Human('Bob') >>> p2=Human('Jeff') >>> c1=Computer('ID007') >>> c2=Computer('ID001') >>> game(p1,p2) Bob gives the value(1-10): 8 Jeff gives the value(1-10): 7 Bob moved: 8 Jeff moved: 7 (Human Bob(0), Human Jeff(1), 'Jeff wins.') >>> game(c1,c2) ID007 moved: 5 ID001 moved: 4 (Computer ID007(0), Computer ID001(1), 'ID001 wins.')
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6