2015-12-14 4 views
2

мне нужно понять следующее поведениепрохождение * арг/** kwargs в производном классе

Traceback (most recent call last): 
    File "FactoryTest.py", line 7, in <module> 
    swift = FactoryLogs.get_service('freezer') 
    File "/home/iob/Devel/elastic_tests/elasticFactory.py", line 12, in get_service 
    return Factory.create_factory(service) 
    File "/home/iob/Devel/elastic_tests/factory.py", line 11, in create_factory 
    return FreezerLogs() 
    File "/home/iob/Devel/elastic_tests/elasticFactory.py", line 68, in __init__ 
    super(FreezerLogs, self).__init__() 
TypeError: must be type, not classobj 

Это возникает, когда я пытаюсь создать экземпляр производные и вызвать метод, определенный в базовом классе ,

class A: 
    def __init__(self): 
    self.att1='a' 

    def _foo(self): 
    self.bar(*args, **kwargs) 

class B(A): 
    def __init__(self): 
    super(B,self).__init__() 

    def bar(self, *args, **kwargs): 
     #code 

Затем я создаю экземпляр типа B, и я вызываю панель. Я чувствую, что здесь что-то не так, и мне нужно кое-что, чтобы просветить меня, потому что, читая документы и другие ресурсы в Интернете, я чувствовал себя более смущенным.

+0

Вы вызываете функцию (бар), который не существует для класса А. Он существует только для класса B, так что вы можно только назвать это там. – Nallath

ответ

4

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

Если вы контролируете базовые классы, убедитесь, что они наследуют от object. В противном случае, не используйте super, но вызвать конструктор базового класса непосредственно:

class B(A): 
    def __init__(self): 
     A.__init__(self) 
     # ... 
+0

Почему бы не использовать super() .__ init __()? Насколько мне известно, в этом нет ничего плохого. – Nallath

+1

@Nallath Ошибка, сообщаемая OP, указывает на использование классов старого стиля, которые не поддерживаются 'super'. – user4815162342

+0

@Nallath super() .__ init__ я думаю, работает для python3, но не в python2.7 – b10n1k