Подтвердить что ты не робот

Метод python __init__ в унаследованном классе

Я хотел бы дать дочернему классу дополнительные атрибуты, не требуя явного вызова нового метода. Итак, есть способ дать унаследованному классу метод типа __init__, который не переопределяет метод __init__ родительского класса?

Я написал код ниже, чтобы проиллюстрировать мой вопрос (отсюда и плохое имя атрибутов и т.д.).

class initialclass():
    def __init__(self):
        self.attr1 = 'one'
        self.attr2 = 'two'    

class inheritedclass(initialclass):
    def __new__(self):
        self.attr3 = 'three'

    def somemethod(self):
        print 'the method'


a = inheritedclass()

for each in a.__dict__:
    print each

#I would like the output to be:
attr1
attr2
attr3

Спасибо

4b9b3361

Ответ 1

Насколько я знаю, это невозможно, однако вы можете вызвать метод init суперкласса, например:

class inheritedclass(initialclass):
    def __init__(self):
        initialclass.__init__(self)
        self.attr3 = 'three'

Ответ 2

Просто вызовите родительский __init__ с помощью super:

class inheritedclass(initialclass):
    def __new__(self):
        self.attr3 = 'three'
        super(initialclass, self).__init__()

Я настоятельно рекомендую следовать соглашениям об именах Python и начинать класс с прописной буквы, например. InheritedClass и InitialClass. Это помогает быстро отличить классы от методов и переменных.

Ответ 3

Прежде всего, вы смешиваете __init__ и __new__, они разные вещи. __new__ не принимает экземпляр (self) в качестве аргумента, он принимает класс (cls). Что касается основной части вашего вопроса, вам нужно использовать super для вызова суперкласса __init__.

Ваш код должен выглядеть так:

class initialclass(object):
    def __init__(self):
        self.attr1 = 'one'
        self.attr2 = 'two'    

class inheritedclass(initialclass):
    def __init__(self):
        self.attr3 = 'three'
        super(inheritedclass, self).__init__()

Ответ 4

Это невероятно просто. Определите новый метод __init__ и вызовите родительский __init__ в начале.

# assuming a class Base, its __init__ takes one parameter x

class Derived(Base):
    def __init__(self, x, y):
        # whatever initialization is needed so we can say Derived is-a Base
        super(Derived, self).__init__(x)
        # now, add whatever makes Derived special - do your own initialization
        self.y = y

В Python 3 вам не нужно (и, следовательно, не должно, для простоты) явно наследовать от object или передать класс и self в super.

Ответ 5

Просто вызовите назначенный метод из родительского init, если он существует:

class initialclass():
    def __init__(self):
        self.attr1 = 'one'
        self.attr2 = 'two'  
        if hasattr(self, 'init_subclass'):
            self.init_subclass()

class inheritedclass(initialclass):
    def init_subclass(self):
        self.attr3 = 'three'