Python

Python 知识量:10 - 41 - 150

10.3 高级特性><

继承- 10.3.1 -

继承是面向对象编程的高级特性之一,它提供了一种重用类的机制,使得可以在既有类的基础上创建新类。被继承的类通常称为基类,新创建的类称为派生类。两个具有直接继承关系的类又称为父类与子类。

下面设计一个玩家类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中的属性和方法。

重写方法- 10.3.2 -

上节示例中,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)

多态- 10.3.3 -

多态也是面向对象编程的高级特性之一。它的主要含义是:不同的对象支持相同的方法,因此对于同一个方法调用,由不同的对象响应同一个命令,会产生不同的结果。

下面设计一个数字游戏,两个玩家各出一个整数(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.')