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 instance update方法中的第一个if语句,它不断地给我一个类型错误,它说我只需要skip的参数,而不需要三个。但我知道,因为它是在块中,我必须有一个例子是狗,它需要三个参数。为什么这种类型的错误不断出现?你知道吗
您还没有向我们展示您得到的实际错误消息,但我将假设您误解了它,实际上是说您只传递了两个参数给一个期望三个的方法。具体来说,我认为问题不在于此代码块:
但后面的那个:
因为
Dog
是Cat
的子类,Dog
的任何实例也是Cat
的实例。因此,如果number
是Dog
,那么第一个代码块将成功运行,然后,因为您使用的是if
而不是elif
,第二个代码块将尝试执行,Python将尝试调用Dog
上的.skip(to, store)
,这不起作用,因为Dog
的skip
需要三个参数。你知道吗从这个做作的例子中不清楚您首先要做什么,但我怀疑解决问题的最佳方法是将第二个
if
改为elif
,这样Dog
就不会被视为非Dog
Cat
了这里有一个派生类,它用不同的签名(形式参数列表)重写基类方法。你可以在这里读到一些:
Python: Can subclasses overload inherited methods?
也许您不应该在这两个类中使用相同的方法名,因为这两个方法实际上并不可互换。或者您可以通过将额外的参数作为
*args
或**kwargs
使它们可以互换,不需要在基类中使用这些额外的参数,而是在派生类中使用它们。像这样:现在,任何一个类都可以用三个参数(加上self)调用其方法。你知道吗
相关问题 更多 >
编程相关推荐