2013-04-13 55 views
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实例更新方法中,它不断给我一个类型错误,它说我只需要跳过而不是三个参数。然而,我知道,因为它正在进行,我必须拥有的是狗,这需要三个论点。为什么这种类型的错误不断出现?愚蠢的例子,但类型错误?

+0

等待,你在输入什么内容? – Greg

+0

运行可能是这样的: – user2175034

+0

你可能会得到一个错误,因为所有者没有属性运行也开始 – Greg

回答

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' 

现在任一类都可以用三个参数(加上自己)调用它的方法。

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) 

因为DogCat一个亚类中,Dog任何实例也Cat的实例。因此,如果numberDog,则第一个代码块将成功运行,然后,由于您使用的是if而不是elif,因此第二个代码块将尝试执行,Python将尝试在Dog上调用.skip(to, store) ,这是行不通的,因为Dogskip需要三个参数。

你想要的东西摆在首位的事,但我怀疑你的问题的最佳解决方案是简单地改变它不是从这个人为的例子清楚第二ifelif使Dog旨意不被视为作为非DogCat s。