我不是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 属性来传递用法文本。在我的情况下,我需要覆盖错误,所以这不是一个选项。
答案 0 :(得分:0)
问题是基类,在这种情况下“argparse”定义了一个“用法”方法,并且无法覆盖它。如果我进入argparse模块代码,则将prog设置为包含程序名称的argv [0]值,并将用法设置为“None”。当“error”方法调用self.usage()时,它会调用基类“None”值来使用并给出错误。我能够通过将我的方法改为“myusage”来解决这个问题,就像那样简单。我从来没有想过这是与基类的名称冲突!
我在pdb中找到了“dir(object)”和“print self”,在这种情况下提供了宝贵的信息。