Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 28, 2018 14:52:33

uf4JaiD5
Зарегистрирован: 2018-12-28
Сообщения: 76
Репутация: +  4  -
Профиль   Отправить e-mail  

Наследование. Неожиданный вызов base class __init__

Беру простой пример с наследованием:

 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__ зачем-то.

Почему это работает не так, как в первом примере? Как “починить”?

Офлайн

#2 Дек. 28, 2018 15:05:56

uf4JaiD5
Зарегистрирован: 2018-12-28
Сообщения: 76
Репутация: +  4  -
Профиль   Отправить e-mail  

Наследование. Неожиданный вызов base class __init__

uf4JaiD5
вижу, что date.__init__ вызывается самостоятельно ещё до запуска child2.__init__

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

Использую Python 3.4.3.

Офлайн

#3 Дек. 28, 2018 15:34:00

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Наследование. Неожиданный вызов base class __init__

https://github.com/python/cpython/blob/master/Lib/datetime.py#L804
Вы просто не удачно выбрали пример. Там нету инициализатора. Только конструктор.
Там можно например так:

 class child2(date):
    def __init__(self, *args):
        self = super().__new__(self.__class__, *args)



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#4 Дек. 28, 2018 15:55:17

uf4JaiD5
Зарегистрирован: 2018-12-28
Сообщения: 76
Репутация: +  4  -
Профиль   Отправить e-mail  

Наследование. Неожиданный вызов base class __init__

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”.

Офлайн

#5 Дек. 28, 2018 16:25:16

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Наследование. Неожиданный вызов base class __init__


 class child2(date):
    def __new__(cls, *args):
        return super().__new__(cls, 4, 5 ,6)



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#6 Дек. 28, 2018 16:29:09

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Наследование. Неожиданный вызов base class __init__

Да это я чет хреновый пример написал в прошлый раз



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#7 Дек. 28, 2018 16:36:14

uf4JaiD5
Зарегистрирован: 2018-12-28
Сообщения: 76
Репутация: +  4  -
Профиль   Отправить e-mail  

Наследование. Неожиданный вызов base class __init__

JOHN_16
return super().__new__(cls, 4, 5 ,6)

Спасибо, теперь всё работает.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version