我在给一个类添加参数时,遇到了继承自另一个类的类型错误

1 投票
4 回答
554 浏览
提问于 2025-04-18 14:40

我有一段代码,里面没有错误:

class Weapon(object): #don't know if this has to inherit from (object)
    def __init__(self,weaponName):
        self.weaponName=weaponName

class Character(object):
    def __init__(self,name,weaponName):
        self.name=name
        self.weapon=Weapon(weaponName)

class NPC(Character):
    def __init__(self,name,weaponName):
        super().__init__(name,weaponName)

class Friendly(NPC):
    def __init__(self,name,weaponName):
        super().__init__(name,weaponName)


sword=Weapon('sword')
guard=NPC('Bob','sword')

print(guard.weapon.weaponName)
print(guard.name)

但是当我试着给武器类添加一个伤害属性的时候:

class Weapon(object):
    def __init__(self,weaponName,weaponDamage):
        self.weaponName=weaponName
        self.weaponDamage=weaponDamage

class Character(object):
    def __init__(self,name,weaponName):
        self.name=name
        self.weapon=Weapon(weaponName)

class NPC(Character):
    def __init__(self,name,weaponName):
        super().__init__(name,weaponName)

class Friendly(NPC):
    def __init__(self,name,weaponName):
        super().__init__(name,weaponName)


sword=Weapon('sword',15)
guard=NPC('Bob','sword')

print(guard.weapon.weaponName)
print(guard.name)

我得到了:

Traceback (most recent call last):
  File "D:\Python files\inheritance test.py", line 21, in <module>
guard=NPC('Bob','sword')
  File "D:\Python files\inheritance test.py", line 13, in __init__
super().__init__(name,weaponName)
  File "D:\Python files\inheritance test.py", line 9, in __init__
self.weapon=Weapon(weaponName)
TypeError: __init__() missing 1 required positional argument: 'weaponDamage'

这是为什么呢?我并不想在角色初始化的时候实际引用weaponDamage,我只是想在后面的函数,比如攻击函数中使用它。如果我有多个武器,我希望能够说‘这个友好的角色有x个武器’,然后它就能通过查看武器类的x实例来知道这个武器的伤害值。

4 个回答

0

你的代码把武器的名字和武器对象搞混了。如果你想把武器的实例传给角色,应该把你的代码改成:

class Character(object):
    def __init__(self,name,weapon):
        self.name=name
        self.weapon=weapon

还有

sword = Weapon('sword',15)
guard = NPC('Bob',sword)

注意,剑的名字前面没有'符号。

0

你不能在

self.weapon=Weapon(weaponName)

的声明中初始化Character。你必须在初始化时提供weaponDamage这个变量,不然它就无法正常工作。

class Character(object):
    def __init__(self,name,weaponName):
        self.name=name
        self.weapon=Weapon(weaponName) 

应该变成

class Character(object):
    def __init__(self,name,weaponName, weaponDamage):
        self.name=name
        self.weapon=Weapon(weaponName, weaponDamage) #This is where you should change it

而且

guard=NPC('Bob','sword')

应该变成

guard=NPC('Bob','sword',15)

这样应该就能正常工作了。否则,你需要在Character的初始化中添加一些“if”语句,以根据weaponName指示的武器类型来设置weaponDamage的值。

1

根据错误信息

File "D:\Python files\inheritance test.py", line 9, in __init__
self.weapon=Weapon(weaponName)
TypeError: __init__() missing 1 required positional argument: 'weaponDamage'

这意味着你需要在第9行调用Weapon的构造函数,像这样。

Weapon(arg1, arg2)

因为Weapon的构造函数正好需要2个参数。

备注:只修改下面这一行可能会避免错误。

class Weapon(object):
    def __init__(self,weaponName,weaponDamage):
        self.weaponName=weaponName
        self.weaponDamage=weaponDamage

class Character(object):
    def __init__(self,name,weaponName):
        self.name=name
        self.weapon=Weapon(weaponName, 1)#<-------modify like this...

class NPC(Character):
    def __init__(self,name,weaponName):
        super().__init__(name,weaponName)

class Friendly(NPC):
    def __init__(self,name,weaponName):
        super().__init__(name,weaponName)


sword=Weapon('sword',15)
guard=NPC('Bob','sword')

print(guard.weapon.weaponName)
print(guard.name)
1

你问了:

这是为什么呢?

Weapon.__init__() 这个地方,你指定了需要一个叫 weaponDamage 的参数。如果你在任何地方创建一个 Weapon 的实例,就必须提供 weaponDamage 的值。

你可以通过在 Weapon.__init__() 中给 weaponDamage 设置一个默认值来解决这个错误。

class Weapon(object):
    def __init__(self,weaponName,weaponDamage=0):
        self.weaponName=weaponName
        self.weaponDamage=weaponDamage

撰写回答