Использование 'super' при создании подкласса класса Python, который не является производным от `object` (старый стиль?) - PullRequest
4 голосов
/ 08 января 2010

Я играю с подклассами OptionParser из модуля библиотеки std optparser. (Python 2.5.2) Когда я пытаюсь это сделать, я получаю исключение:

TypeError: super() argument 1 must be type, not classobj

Глядя на OptionParser, он не является производным от object. Поэтому я добавил object в качестве родительского класса (показано ниже) и super работает правильно.

from optparse import OptionParser, Option
class MyOptionParser(OptionParser, object):
    """Class to change 
    """
    def __init__(self,
             usage=None,
             option_list=None,
             option_class=Option,
             version=None,
             conflict_handler="error",
             description=None,
             formatter=None,
             add_help_option=True,
             prog=None,
             epilog=None,
            ):

      super(MyOptionParser, self).__init__(usage, option_list, option_class, version, conflict_handler, description, formatter, add_help_option, prog, epilog)

if __name__ == '__main__':
    """Run a quick test
    """
    parser = MyOptionParser()
    parser.add_option("-t", "--test", type="string", dest="test")
    (options, args) = parser.parse_args()
    print "The test option is: %s" % options.test

Это правильный путь?

1 Ответ

5 голосов
/ 08 января 2010

Да, я не понимаю, почему это не сработает. Вам просто нужно добавить пару пробелов прямо перед этим супер-вызовом - как написано прямо сейчас, он не является частью вашего пользовательского init метода. Кроме того, вы можете использовать ярлык ** kwargs - вы можете выполнить проверку ключа kwargs в своем методе, если это то, что вы хотите сделать:

class MyOptionParser(OptionParser, object):
    """Class to change 
    """
    def __init__(self, **kwargs):
        # You can limit kwargs keys here
        super(MyOptionParser, self).__init__(**kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...