如何在子类中更改超类的实例方法?

时间:2017-06-06 22:36:27

标签: python-3.x inheritance

当我在OOP的继承概念上做练习时,我脑子里出现了一个问题,问题是关于以下练习:

import random
import time
class Character():
    Character_list = []

    def __init__(self, name, life=100, power=100):
        self.name = name
        self.life = life
        self.power = power

    def print(self):
        print("\n{}\n{} character details:".format("-" * 80, self.name))
        print("Name: {}\nLife: {}\nPower: {}\n{}".format(self.name, self.life, self.power, "-" * 80))

    def attack(self):
        attack = random.randrange(self.power + 1)
        if self.power <= 0:
            print("{} can't attack because power is empty".format(self.name))
            return False
        else:
            print("{} is attacking...".format(self.name))
            for i in range(80):
                time.sleep(0.05)
                print("-", end="", flush=True)
            self.power -= attack
            print("\n-  Spent power: {}".format(attack))
            print("-   Remaining power: {}\n".format(self.power))
            if attack == 0:
                print("{} missed.".format(self.name))
        return attack

    def attacked(self, attack):
        if attack != 0:
            print("{} injured.".format(self.name))
            self.life -= attack
            print("-  Remaining life: {}".format(self.life))
            if self.life <= 0:
                print("{} died.".format(self.name))
                self.Character_list.remove(self)


class Barbarian(Character):
    Character_list = []


class Wizard(Character):
    Character_list = []

我想问的关于上述代码的问题是:有一个名为Character的超类。后来创建的Wizard和Barbarian子类继承了超类的所有功能。假设超类的 power 实例属性的名称对于每个子类是不同的。例如,对于Barbarian子类,它是 strength ,对于Wizard子类,它是 magic 而不是 power

如果要将超类的实例方法复制到子类,为了使每个子类使用其自己的类的实例属性而不是 power 名称,应该重命名超类实例方法在子类中更改了名称?或者,对于我想要执行的操作,除了通过更改权限的名称将超类实例方法重写为子类之外,您将如何建议一个方法?谢谢。

1 个答案:

答案 0 :(得分:0)

完全披露 - 我是一个试图回答python问题的c#dev(所以这个答案可能会无意中变得很搞笑......)

我能想到的两条最简单的途径:

A)在基类中声明一个变量,然后将构造函数更改为需要一个&#39; PowerWord&#39;传入(然后将其值放入变量中。)任何时候任何事情都试图声明某种角色的新实例,他们需要传递该角色的PowerWord(虽然我可以想象)你只需让派生类传入它。)

B)使用抽象属性。这基本上是说,&#34;嘿,如果你想写一个源于我的课程,你最好有一个“PowerWord”&#39; 。属性#&34;然后,这使您可以在基类中使用PowerWord,而无需准确指定PowerWord是什么(因为每个派生类都将对它应该是什么做出答案。)

......无论如何,是的 - 你有正确的想法。你应该肯定不要将这些功能复制/粘贴到每个派生类中,只是为了改变它们的权力&#39;力量&#39;或者是魔术&#39;。