Ответ 1
Насколько я знаю, это невозможно, однако вы можете вызвать метод init суперкласса, например:
class inheritedclass(initialclass):
def __init__(self):
initialclass.__init__(self)
self.attr3 = 'three'
Я хотел бы дать дочернему классу дополнительные атрибуты, не требуя явного вызова нового метода. Итак, есть способ дать унаследованному классу метод типа __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
Спасибо
Насколько я знаю, это невозможно, однако вы можете вызвать метод init суперкласса, например:
class inheritedclass(initialclass):
def __init__(self):
initialclass.__init__(self)
self.attr3 = 'three'
Просто вызовите родительский __init__
с помощью super
:
class inheritedclass(initialclass):
def __new__(self):
self.attr3 = 'three'
super(initialclass, self).__init__()
Я настоятельно рекомендую следовать соглашениям об именах Python и начинать класс с прописной буквы, например. InheritedClass
и InitialClass
. Это помогает быстро отличить классы от методов и переменных.
Прежде всего, вы смешиваете __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__()
Это невероятно просто. Определите новый метод __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
.
Просто вызовите назначенный метод из родительского 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'