2
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 语句,它不断给我一个类型错误,它说我只需要为 skip 而不是三个参数。但是我知道因为它在块中,所以我必须拥有的实例是 dog,它需要三个参数。为什么会不断出现这种类型的错误?

4

2 回答 2

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是 a Dog,第一个代码块将成功运行,然后,因为您使用if而不是elif,第二个代码块将尝试执行,Python 将尝试调用.skip(to, store)Dog这不起作用, 因为Dog'sskip需要三个参数。

从这个人为的示例中不清楚您首先要做什么,但我怀疑您问题的最佳解决方案是将第二个简单地更改if为 an elif,这样Dogs 就不会被视为非Dog Cats。

于 2013-04-13T01:46:31.897 回答
0

您在这里得到的是一个派生类,它使用不同的签名(形式参数列表)覆盖基类方法。您可以在此处阅读有关此内容的一些信息:

Python:子类可以重载继承的方法吗?

也许您不应该在两个类中使用相同的方法名称,因为这两种方法实际上不能互换。*args或者,您可以通过将额外参数作为or使它们可互换,**kwargs在基类中不需要这些额外参数,而是在派生类中使用它们。像这样的东西:

class Cat(object):
    def skip(self,to,store,*args):
        return 'Cat'

class Dog(Cat):
    def skip(self,to,store,happier):
        return 'Doggy'

现在,任何一个类都可以使用三个参数(加上 self)调用其方法。

于 2013-04-13T01:45:33.967 回答