python:从argparse模块派生的类不能调用自己的派生类方法

时间:2018-01-28 03:39:33

标签: python class derived

我不是python类的专家,但我已经测试和搜索,无法弄清楚我在这里做错了什么。如果我用方法定义基类,我可以从类中调用类方法。如果我从派生类中的argparse模块覆盖基类方法,则无法调用派生类方法。我需要了解如何定义可以调用的派生类方法。我不知道这对argparse或所有派生类是否特殊。这是两个测试类:

class testA():
def usage(self):
    print "testing testA"

def __init__(self):
    self.usage()

在pdb中,我可以执行“dir(testA),我看到”使用“方法。我也可以在实例化类testA时调用它。

import subprocess
import argparse
import sys

class MyParser(argparse.ArgumentParser):
    def usage(self):
        print "redispub.py -s 'started' -c 'ethandevelop-C1-G1' -m 'salt started' -e 'us-east-develop.onvamdev.com' -p 6379"
        print

    def error(self, message):
        sys.stderr.write('error: %s\n' % message)
        self._usage()
        self.__usage()
        self.usage()
        sys.exit(2)

注意在上面的代码中我称之为“使用”三种不同的方式。 3个调用中的错误略有不同,但没有一个工作。我单独尝试了每一个,但上面只放了所有这些,所以你可以看到尝试了什么。在pdb中我可以做“dir(MyParser)”并且我也看到“用法”作为方法,但是当我调用它时,我得到“无属性”或TypeError:“'NoneType'对象不可调用”: - > self._usage() AttributeError:“'MyParser'对象没有属性'_usage'”

  

/data/onvu360/redispub.py(21)误差()    - > self._usage()   (Pdb)n    - 返回 -   /data/onvu360/redispub.py(21)error() - >无

- > self.usage() (Pdb)n TypeError:“'NoneType'对象不可调用”

我想知道它是否与我覆盖基类“错误”方法的事实有关,它无法看到我的派生类“使用”方法?

*根据我的回答编辑* 以下是适用于argparse的有效代码:

import subprocess
import argparse
import sys

class MyParser(argparse.ArgumentParser):
    def myusage(self):
        print "redispub.py -s 'started' -c 'ethandevelop-C1-G1' -m 'salt started' -e 'us-east-develop.onvamdev.com' -p 6379"
        print

    def error(self, message):
        sys.stderr.write('error: %s\n' % message)
        self.myusage()
        sys.exit(2)

*其他更新* 下面提到您可能不需要继承ArgumentParser,在这种情况下,您可以使用其 usage 属性来传递用法文本。在我的情况下,我需要覆盖错误,所以这不是一个选项。

1 个答案:

答案 0 :(得分:0)

问题是基类,在这种情况下“argparse”定义了一个“用法”方法,并且无法覆盖它。如果我进入argparse模块代码,则将prog设置为包含程序名称的argv [0]值,并将用法设置为“None”。当“error”方法调用self.usage()时,它会调用基类“None”值来使用并给出错误。我能够通过将我的方法改为“myusage”来解决这个问题,就像那样简单。我从来没有想过这是与基类的名称冲突!

我在pdb中找到了“dir(object)”和“print self”,在这种情况下提供了宝贵的信息。