Используя супер () в классах

Я пытаюсь использовать супер() для простой иерархии классов этим способом:

class Employee(object):
    def __init__(self, name):
        self.name = name

class FullTime(Employee):
    def __init__(self, name, satOff, freeDays=[], alDays=[], programDays=[]):
        global satsOffDict
        global dayDict
        super(Employee, self).__init__(name)

Однако я получаю эту ошибку:

TypeError: object.__init__() takes no parameters

Я прочитал, что необходимо сделать объект родительского типа объекта (модернизированные классы) для супер, чтобы работать. Если я изменяю класс Сотрудник (объект) классифицировать Сотрудника (), я получаю эту ошибку:

TypeError: must be type, not classobj

Что продолжается?

3
nl ja de
Вы могли бы хотеть быть тщательными мимолетными списками как дефолтами __ init __ как этот. That' s, просто прося об интересном поведении... python the mutable default argument">stackoverflow.com/questions/1132941/…
добавлено автор mgilson, источник

2 ответы

Вы используете ток класс в супер() :

super(FullTime, self).__init__(name)

super() looks for requested methods relative to the first argument; you started the search from Employee instead, looking for the parent classes; object.__init__() is the next parent method that matches in that case.

Необходимо использовать текущий класс, потому что Пайтон должен искать базовые классы в Заказ резолюции метода; тот заказ зависит от того, как ваш текущий класс получен из, он - базовые классы (особенно, если есть многократное наследование, или базовый класс заканчивает тем, что был сослан многократно).

На Питоне 3.x, можно использовать супер() без любых аргументов, и компилятор добавит дополнительный намек к вашему методу так, чтобы это могло определить правильный класс, чтобы начаться с.

7
добавлено
@acjohnson55: MRO базовых классов зависят от наследующего класса. Вообразите класс, который наследует от два суперкласса.
добавлено автор Martijn Pieters, источник
@acjohnson55: Точно. И это могло бы быть неправильное, если бы был различный путь MRO, чтобы следовать на основе вашего текущего класса.
добавлено автор Martijn Pieters, источник
@acjohnson55: Явный лучше, чем неявный все же. Но иногда чистота ударов практичности, таким образом, никакой-args супер() выбор был добавлен в Пайтоне 3.
добавлено автор Martijn Pieters, источник
Обратите внимание, что в 3.x, супер() не может взять аргументы и хорошо работать.
добавлено автор Gareth Latty, источник
Вы могли прокомментировать, почему это? I' ve всегда задавался вопросом. Кажется, как будто производный класс должно быть тривиально легко определить автоматически переводчиком. Есть ли вариант использования для использования чего-то другого как первый параметр?
добавлено автор acjay, источник
Так, you' ре говоря, что можно использовать базовый класс в супер , но тогда совместимый метод лучше быть в основа class' s происхождение суперкласса где-нибудь?
добавлено автор acjay, источник
Хорошо, прохладный. Человек, действительно кажется, как будто это имело бы настолько больше смысла просто привести первый дополнительный аргумент. Я рискнул бы и сказал бы, что подавляющее большинство просьб супер для ситуаций, где нормальный, MRO прекрасно подходит.
добавлено автор acjay, источник
Я имею в виду, если нам нравится явный так, почему бы не вернуться к статическому контролю типов и непатентованным средствам стиля C++? Или мы можем всегда просто писать на собрании:) Спасибо за информацию, хотя
добавлено автор acjay, источник

Когда вы используете супер в Пайтоне, необходимо определять , полученные тип (то есть, класс, в котором вы пишете требование) как первый параметр.

super(FullTime, self).__init__(name)
2
добавлено
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

Software Design and OOP
Software Design and OOP
1 481 участник(ов)

OOP, software design, architecture, GRASP, GoF, SOLID, separation of concerns, безысходность. Пожалуйста, придерживайтесь указанных тем. https://oopru.github.io More cool stuff: @fp_ru @tdd_ru @coding_interview_ru @coding_ru

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community