Найти - Пользователи
Полная версия: Наследование. Неожиданный вызов base class __init__
Начало » Python для новичков » Наследование. Неожиданный вызов base class __init__
1
uf4JaiD5
Беру простой пример с наследованием:

 class base():
	def __init__(self, a):
		self.a = a
class child(base):
	def __init__(self, arg):
		base.__init__(self,arg+1)
x = child(2)
print(x.a)

Всё работает.

Пробую использовать это:

 from datetime import date
class child2(date):
	def __init__(self, *args):
		print(self.year)
		#date.__init__(self,4,5,6)
x = child2(1,2,3)
print(x)

И вижу, что date.__init__ вызывается самостоятельно ещё до запуска child2.__init__. А я, наоборот, вызвать date.__init__ не могу. Закомментированная строка даёт ошибку “TypeError: object.__init__() takes no parameters”. Т.е. там непонятно что происходит, object.__init__ зачем-то.

Почему это работает не так, как в первом примере? Как “починить”?
uf4JaiD5
uf4JaiD5
вижу, что date.__init__ вызывается самостоятельно ещё до запуска child2.__init__

Т.к. первая же строка child2.__init__, print(self.year), успешно обращается к self.year, который есть только в date.

Использую Python 3.4.3.
JOHN_16
https://github.com/python/cpython/blob/master/Lib/datetime.py#L804
Вы просто не удачно выбрали пример. Там нету инициализатора. Только конструктор.
Там можно например так:
 class child2(date):
    def __init__(self, *args):
        self = super().__new__(self.__class__, *args)
uf4JaiD5
JOHN_16
Вы просто не удачно выбрали пример.

Хочу наследовать именно этот класс. Можно и как-нибудь по-другому.

JOHN_16
Там нету инициализатора. Только конструктор.

 >>> '__init__' in dir(date)
True

Или это не то?

JOHN_16
Там можно например так: self = super().__new__(self.__class__, *args)

1. Ну это же не отменяет того, что date с ненужными мне параметрами создаётся ещё до
child2.__init__.

2. Не понял, что делает эта строка. На первый взгляд – ничего:

 class child2(date):
	def __init__(self, *args):
		self = super().__new__(self.__class__, 4,5,6)
x = child2(1,2,3)
print(x)

Получаем “0001-02-03”. А цель – получить “0004-05-06”.
JOHN_16

 class child2(date):
    def __new__(cls, *args):
        return super().__new__(cls, 4, 5 ,6)
JOHN_16
Да это я чет хреновый пример написал в прошлый раз
uf4JaiD5
JOHN_16
return super().__new__(cls, 4, 5 ,6)

Спасибо, теперь всё работает.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB