当我在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 名称,应该重命名超类实例方法在子类中更改了名称?或者,对于我想要执行的操作,除了通过更改权限的名称将超类实例方法重写为子类之外,您将如何建议一个方法?谢谢。
答案 0 :(得分:0)
完全披露 - 我是一个试图回答python问题的c#dev(所以这个答案可能会无意中变得很搞笑......)
我能想到的两条最简单的途径:
A)在基类中声明一个变量,然后将构造函数更改为需要一个&#39; PowerWord&#39;传入(然后将其值放入变量中。)任何时候任何事情都试图声明某种角色的新实例,他们需要传递该角色的PowerWord(虽然我可以想象)你只需让派生类传入它。)
B)使用抽象属性。这基本上是说,&#34;嘿,如果你想写一个源于我的课程,你最好有一个“PowerWord”&#39; 。属性#&34;然后,这使您可以在基类中使用PowerWord,而无需准确指定PowerWord是什么(因为每个派生类都将对它应该是什么做出答案。)
......无论如何,是的 - 你有正确的想法。你应该肯定不要将这些功能复制/粘贴到每个派生类中,只是为了改变它们的权力&#39;力量&#39;或者是魔术&#39;。