class Cat(object):
def __init__(self,run,fast):
self.run=run
self.fast=fast
def skip(self,to,store):
return 'Cat'
class Dog(Cat):
def __init_(self,run, fast,tongue):
Cat.__init__(self,run,fast)
self.tongue=tongue
def skip(self,to,store,happier):
return 'Doggy'
class Parent(object):
def __init__(self,velocity):
self.velocity=velocity
"""
velocity is a list of speeds or something. But it can
be from dogs or cats. Fast is a single number
"""
class Owner(Parent):
def __init__(self,smile):
Parent.__init__(self,velocity)
self.smile=smile
self.jumper=[]
def update(self):
# velocity is a list of instances of cats and dog
for number in self.velocity:
if isinstance(number,Dog):
number.skip(to,store,happier)
self.jumper.append(number)
if isinstance(number,Cat):
number.skip(to,store)
self.jumper.append(number)
不断出现的问题就是说我在if实例更新方法中首先使用if语句,它不断给我一个类型错误,它说我只需要跳过参数而不是三个。然而我知道因为它在块中我必须拥有的实例是狗,它需要三个参数。为什么会出现这种类型错误?
答案 0 :(得分:3)
您还没有向我们展示您获得的实际错误消息,但我会假设您误解了它并且它实际上是在说您&# 39;仅将两个参数传递给期望 3 的方法。具体来说,我希望问题不在于此代码块:
if isinstance(number,Dog):
number.skip(to,store,happier)
self.jumper.append(number)
但正好在它之后:
if isinstance(number,Cat):
number.skip(to,store)
self.jumper.append(number)
由于Dog
是Cat
的子类,因此Dog
的任何实例也是Cat
的实例。因此,如果number
是Dog
,则第一个代码块将成功运行,然后,因为您使用的是if
而不是elif
,代码块将尝试执行,并且Python将尝试在.skip(to, store)
上调用Dog
,这不起作用,因为Dog
' s {{1}期待三个论点。
从这个人为的例子中我不清楚你想要做什么,但我怀疑你的问题的最佳解决方案是简单地将第二个skip
更改为{{1因此if
不会被视为非elif
Dog
s。
答案 1 :(得分:0)
您在这里得到的是一个派生类,它使用不同的签名(形式参数列表)覆盖基类方法。你可以在这里阅读一些相关内容:
Python: Can subclasses overload inherited methods?
也许你不应该在两个类中使用相同的方法名,因为这两个方法实际上不可互换。或者你可以通过将额外的参数作为*args
或**kwargs
来使它们可以互换,不需要在基类中使用那些额外的参数,而是在派生中使用它们。像这样:
class Cat(object):
def skip(self,to,store,*args):
return 'Cat'
class Dog(Cat):
def skip(self,to,store,happier):
return 'Doggy'
现在,任何一个类都可以使用三个参数调用其方法(加上self)。