Недостающие методы в наследовании классов Python? - PullRequest
1 голос
/ 20 декабря 2010

Я не очень опытен с классовым наследованием. Пожалуйста, помогите мне и посмотрите на код ниже:

class Handle(STAFHandle):

    def __init__(self, HandleName):
        handle = STAFHandle.__init__(self, HandleName)
        self.initLogger(handle)

    def initLogger(self, handle):
        self.logger = Logging(handle, 'Test')

handle = Handle('test')
handle.logger.info('test')

говорится, что метод отправки не определен:

result = handle.submit(system, service, logRequest) 
AttributeError: 'NoneType' object has no attribute 'submit'

но если я поменяю его на:

class Handle(STAFHandle):
    def __init__(self, HandleName):
        handle = STAFHandle.__init__(self, HandleName)

    def initLogger(self, handle):
        self.logger = Logging(handle, 'Test')

handle = Handle('test')
handle.initLogger(handle)
handle.logger.info('test')

это работает. Почему есть разница? Большое спасибо !!

Cheers, Же

1 Ответ

4 голосов
/ 20 декабря 2010

STAFHandle.__init__ возвращает None. Вы, вероятно, хотите:

class Handle(STAFHandle):
    def __init__(self, handle_name):
        super(Handle, self).__init__(handle_name)
        self.initLogger()

    def initLogger(self):
        self.logger = Logging(self, 'Test')

handle = Handle('test')

Помните, что __init__ методы принимают в качестве первого аргумента объект, а изменяют этот объект. Поэтому, когда вы вызываете super(Handle, self).__init__(handleName), вы изменяете свойства self вместо того, чтобы возвращать новый объект. Разница между вашими двумя примерами заключается в том, что переменная handle в двух вызовах initLogger относится к разным вещам.

Обратите внимание, что я заменил явный вызов STAFHandle.__init__ на прокси super; в данном случае это эквивалентно, но обеспечивает большую гибкость, поскольку теперь вы можете изменять наследование класса, не нарушая его __init__.

Я также изменил HandleName на handle_name, чтобы соответствовать соглашениям Python (CamelCase относится к классам).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...