Python __init__ метод в унаследованном классе - PullRequest
19 голосов
/ 12 апреля 2011

Я хотел бы дать дочернему классу некоторые дополнительные атрибуты без необходимости явного вызова нового метода. Так есть ли способ дать унаследованному классу метод типа __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

Спасибо

Ответы [ 5 ]

33 голосов
/ 12 апреля 2011

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

class inheritedclass(initialclass):
    def __init__(self):
        initialclass.__init__(self)
        self.attr3 = 'three'
16 голосов
/ 12 апреля 2011

Просто позвоните родителю __init__, используя super:

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

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

5 голосов
/ 12 апреля 2011

Прежде всего вы смешиваете __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__()
3 голосов
/ 12 апреля 2011

Это невероятно просто.Определите новый метод __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.

0 голосов
/ 12 апреля 2011

Просто вызовите назначенный метод из родительского 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...