Python中的继承:" TypeError:run()不带参数(给定2个)"

时间:2015-05-20 17:00:14

标签: python inheritance overwrite

我看到其他与此类似的主题,但实际上并不是我所需要的。

我有一个名为" Base"那里需要几种方法。最后是它自己的"运行":

class BaseComponent(OSUtils):

    def __init__(self, cpio):
        OSUtils.__init__(self, cpio.logger)
        self.io = cpio

    def debug(self, msg):
        print("[Debug] %s" % msg)
        self.logger.debug(msg)

    def start(self, debug=False):

        try:
            self.info("--- Running %s:" % self.__class__.__name__)
            print self.__class__.__name__
            self.run(debug)

    def run(debug=False):
        component = BaseComp(cpio.ComponentIO())
        component.start(debug)    

if __name__ == '__main__':
    print ("Testing")

我有另一个名为" BaseComp"扩展" Base"使用特定于特定需求的方法,在其上有一个"运行"必须重写的方法,并在其结束时运行"班级本身:

import dummy.io as cpio
class BaseComp(Base):

   def __init__(self, cpio):
       Base.__init__(self, cpio)
       self.io = cpio

   def run(self, debug=False):
       #this method will be rewritten latter
       #no matter what goes below
       #
       msg="blahblahblah"
       Exception(msg)

def run(debug=False):
    component = BaseComp(cpio.ComponentIO())
    component.start(debug)    

if __name__ == '__main__':
    print ("Testing")

此类由另一个名为Hello的类扩展。你好重写方法"运行" BaseComp也有自己的" run"在末尾。在此运行中,调用" component.start(debug)

from base_components import BaseComp
import dummy.io as cpio
class Hello(BaseComp):

    def run(self, debug=True):
        print "Begin"
        msg="hello world"
        print "End"

def run(debug=True):
    component = Hello(cpio.ComponentIO())
    component.start(debug)

if __name__ == '__main__':

    print("Testing Start")
    run(debug = True)
    print("Test End")

component.start(debug)调用方法从第一个类开始(" Base")

然而,当我打电话时,我得到了

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/home/user/components/comp1/__init__.py", line 166, in run component.start()
  File "/home/user/directory/apps/Base.py", line 58, in start self.run(debug)  ***** this is in the start method 
TypeError: run() takes no arguments (2 given)

我不知道导致错误的原因。我相信这可能与很多&#34; run&#34;被称为方法

这让我抓狂,因为我在整个继承架构中有点迷失

任何帮助都会很精彩

THKS

3 个答案:

答案 0 :(得分:1)

我认为你只是有一个缩进错误。在基本文件中,run函数在类中缩进,因此被称为run 方法;但它不接受自动self参数,因此错误。

您可能会发现重命名这些功能非常有用,这样他们就不会与这些方法共享名称。

答案 1 :(得分:0)

首先,你不能拥有这个

class SomeClass(object):
   def somefunc():
      print 'somefunc in SomeClass'

因为python类方法接收了自我&#39;默认情况下。 试图从类实例调用somefunc会产生

TypeError: somefunc() takes no arguments (1 given)

您可以添加自我

class SomeClass(object):
   def somefunc(self):
      print 'somefunc in SomeClass'

或者,如果您不需要或不想要自我&#39;你可以使它成为顶级函数(不是类函数)或使其成为静态方法

class SomeClass(object):
   @staticmethod
   def somefunc():
      print 'somefunc in SomeClass'

这就是您在BaseComponent类中所拥有的内容&#39;运行方法。

答案 2 :(得分:0)

从您的错误打印输出中,您似乎正在调用OSUtils中定义的run()方法(??)。与Wyrmwood提到的一样,BaseComponent类中定义的run方法应该具有self参数或@staticmethod装饰器。

实施例

class BaseComponent(OSUtils):
    def run(self, debug=False):
        ...

class BaseComponent(OSUtils):
    @staticmethod
    def run(debug=False):
        ...