С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/47: Рейтинг темы: голосов - 47, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 15.04.2019
Сообщений: 6
1

Не могу передать параметр в родительский конструктор при создании экземпляра класса

21.05.2019, 15:56. Показов 8770. Ответов 7

Author24 — интернет-сервис помощи студентам
Хочу создать экземпляр класса Human, и передать в конструктор его родительского класса параметр size . Для этого вызываю в классе Human родительский __init__() с помощью super() .Почему это не работает?
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
class Ape:
    def __init__(self, size):
        self.size = size
 
 
class Human(Ape):
   def __init__(self, name=None):
        self.name = name
        super().__init__()
 
 
man = Human(size='big')
print(man.size)
выдает ошибку:
Bash
1
2
3
4
5
6
Traceback (most recent call last):
  File "C:/testkoro/untitled2/tst_date.py", line 12, in <module>
    man = Human(size='big')
TypeError: __init__() got an unexpected keyword argument 'size'
 
Process finished with exit code 1
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Блог
21.05.2019, 15:56
Ответы с готовыми решениями:

При создании экземпляра класса, создается 2 экземпляра вместо 1
Подсчет экземпляров ведется с помощью статического члена num_dogs, который во всех трех...

Как при создании экземпляра класса инициализировать переменные вложенного класса
Здравствуйте. Подскажите пожалуйста как при создании екземпляра класа инициализировать переменные...

Что происходит с методами класса при создании экземпляра класса ? Память для каждого метода также отводится ?
Вопрос чайника: Что происходит с методами класса при создании экземпляра класса ? Память для...

Ошибка при создании экземпляра класса
На скринах показано, где ошибка Вот код: #include &lt;iostream&gt; #include &lt;string&gt; #include...

7
Эксперт Python
4640 / 2056 / 363
Регистрация: 17.03.2012
Сообщений: 10,139
Записей в блоге: 6
21.05.2019, 18:20 2
Используйте теги оформления кода.

Цитата Сообщение от dkdcvc Посмотреть сообщение
Для этого вызываю в классе Human родительский __init__() с помощью super() .Почему это не работает?
Очевидно, потому что вы туда size не передаёте.

Рискну предположить, что вы ожидаете, что size передастся в Ape вот в этом вызове:
Цитата Сообщение от dkdcvc Посмотреть сообщение
man = Human(size='big')
Таки нет, автоматически этого не происходит.
0
5041 / 3387 / 1155
Регистрация: 21.03.2016
Сообщений: 8,209
21.05.2019, 20:47 3
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
class Ape:
    def __init__(self, size):
        self.size = size
 
 
class Human(Ape):
    def __init__(self,size, name=None):
        self.name = name
        super().__init__(size)
 
 
man = Human(size='big')
print(man.size)
0
33 / 30 / 16
Регистрация: 21.01.2014
Сообщений: 101
21.05.2019, 20:53 4
Надо явно передавать параметр в "конструктор" родителя:
Python
1
2
3
4
class Human(Ape):
    def __init__(self, name=None, size=None):
        super().__init__(size)
        self.name = name
0
0 / 0 / 0
Регистрация: 15.04.2019
Сообщений: 6
22.05.2019, 10:00  [ТС] 5
Цитата Сообщение от Dominatrix Посмотреть сообщение
Надо явно передавать параметр в "конструктор" родителя:
Python
1
2
3
4
class Human(Ape):
    def __init__(self, name=None, size=None):
        super().__init__(size)
        self.name = name
Смысл в том что тут у вас в "def __init__(self, name=None, size=None)" есть принимаемый аргумент "size=None", и при создании экземпляра класса Human и при передаче в него аргумента для size будет вызываться __init__() класса Human, а мне нужно чтобы вызывался __init__() класса Ape.

Добавлено через 37 секунд
Цитата Сообщение от Semen-Semenich Посмотреть сообщение
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
class Ape:
    def __init__(self, size):
        self.size = size
 
 
class Human(Ape):
    def __init__(self,size, name=None):
        self.name = name
        super().__init__(size)
 
 
man = Human(size='big')
print(man.size)
Смысл в том что тут у вас в "def __init__(self, name=None, size=None)" есть принимаемый аргумент "size=None", и при создании экземпляра класса Human и при передаче в него аргумента для size будет вызываться __init__() класса Human, а мне нужно чтобы вызывался __init__() класса Ape.

Добавлено через 2 минуты
Цитата Сообщение от dondublon Посмотреть сообщение
Используйте теги оформления кода.


Очевидно, потому что вы туда size не передаёте.

Рискну предположить, что вы ожидаете, что size передастся в Ape вот в этом вызове:

Таки нет, автоматически этого не происходит.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
class Ape:
    def __init__(self, size=None):
        self.size = size
 
 
class Human(Ape):
   def __init__(self, name=None):
        self.name = name
        super().__init__(size=None)
 
 
man = Human(size='big')
print(man.size)
Так тоже не работает

Добавлено через 15 минут
Возможно не понятно то что я хочу сделать. Есть два класса, родитель Ape и наследник Human, и у того и у другого есть свои __init__() :
Python
1
2
3
4
5
6
class Ape:
    __init__(self, size=None)
 
 
Human(Ape):
    __init__(self, name=None)
Я хочу создать экземпляр класса Human и передать в конструктор Ape параметр size :
Python
1
man = Human(size='big')
Хочу узнать как это реализовать с помощью
Python
1
super()
0
Эксперт Python
4640 / 2056 / 363
Регистрация: 17.03.2012
Сообщений: 10,139
Записей в блоге: 6
22.05.2019, 10:01 6
Цитата Сообщение от dkdcvc Посмотреть сообщение
Так тоже не работает
Вы правы, не работает.
Правда, я не совсем понимаю, к чему тут относится слово "тоже".

В помощь обнаружению такой очевидной ошибки у меня даже pycharm подсвечивает вызов Human(size='big'). И сообщение об ошибке указывает именно на него. Вам осталось чуть-чуть подумать.
0
0 / 0 / 0
Регистрация: 15.04.2019
Сообщений: 6
22.05.2019, 10:41  [ТС] 7
Цитата Сообщение от dondublon Посмотреть сообщение
Вы правы, не работает.
Правда, я не совсем понимаю, к чему тут относится слово "тоже".

В помощь обнаружению такой очевидной ошибки у меня даже pycharm подсвечивает вызов Human(size='big'). И сообщение об ошибке указывает именно на него. Вам осталось чуть-чуть подумать.
Потому что в "man = Human(size='big')" я обращаюсь к конструктору "Human", в котором нет принимаемого аргумента "size". Для этого я и использую super().__init__(size). Так для чего же тогда нужна конструкция "super().__init__()" если не для таких случаев?

Добавлено через 19 минут
В общем, не правильно понимал работу костыля метода super(). Проблема решена (пошел учить Java). Тему можно закрывать.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
class Ape:
    def __init__(self, size):
        self.size = size
 
 
class Human(Ape):
   def __init__(self, size, name):
        self.name = name
        super().__init__(size)
 
 
man = Human(size='big', name='John')
print(man.size)
Добавлено через 8 минут
Подумал еще чуть-чуть и понял что неправ. Было глупо от "super().__init__()" ожидать другого поведения.
0
Эксперт Python
4640 / 2056 / 363
Регистрация: 17.03.2012
Сообщений: 10,139
Записей в блоге: 6
22.05.2019, 10:56 8
dkdcvc, браво.
На самом деле, во втором примере дело не в super, дело в __init__.
0
22.05.2019, 10:56
cpp_developer
Эксперт
20123 / 5690 / 417
Регистрация: 09.04.2010
Сообщений: 12,546
Блог
22.05.2019, 10:56
Помогаю со студенческими работами здесь

Ошибка при создании экземпляра класса
Почему выдает такую ошибку?(С base уже пробовал, не работает) Код программы: Form1.cs: using...

Ошибка при создании экземпляра класса Database
Всем доброго времени суток. Выходит ошибка, когда пытаюсь создать экземпляр класса Database:...

Ошибка при создании экземпляра абстрактного класса
Пытаюсь создать Silverlight веб-приложение в Visual Studio 2010 pro по руководству:...

Переполнение стека при создании экземпляра класса
Здравствуйте. Изучаю C#, решил попробовать создать дерево классов. Базовый абстрактный класс -...

Ошибка при создании экземпляра шаблонного класса
Есть шаблонный управляемый класс, не знаю как создать его экземпляр в динамической памяти. ...

При создании экземпляра класса теряются данные
Доброго времени суток ребят помогите плз . Суть проблемы если я жестко прошиваю путь к файлу то...

Размер массива при создании экземпляра класса
Нет возможности использовать динамически выделяемую память под массив. Используется в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru