2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Наследование (super) в python 2.7
Сообщение15.09.2018, 09:38 
Аватара пользователя
Здравствуйте, изучаю ООП в python 2.7. Не могу понять, что не так в этом коде:

Используется синтаксис Python
class Person():
    def __init__(self, name):
        self.name = name

class EmailPerson(Person):
    def __init__(self, name, email):
        super(EmailPerson, self).__init__(name)
        self.email = email

bob = EmailPerson('Bob', 'bob@gmail.com')
 

Класс EmalPerson - наследник класса Person. Он наследует из Person все то, что делает там метод __init__, кроме того, его __init__ содержит атрибут email. Синтаксис слова super() вроде как правильный: имя класса, который наследует, ссылка на объект (self), после чего метод класса Person, который наследуется. Что не так? Выдает ошибку:
Код:
TypeError: super() argument 1 must be type, not classobj

Но ведь EmailPerson - это не объект, а класс. В чем претензия?

 
 
 
 Re: Наследование (super) в python 2.7
Сообщение15.09.2018, 10:32 
Этот код проглатывает Python 3.x, но Python 2.7 его не переваривает. Причина в том, что синтаксис т.н. new-style classes в Python 2.7 требует явного указания того, что класс наследуется от типа object: class Person(object), в то время как в Python 3.x это требование было ослаблено (поскольку т.н. old-style classes были из него удалены), и можно написать просто class Person() (при этом по умолчанию будет считаться, что класс унаследован от object).

 
 
 
 Re: Наследование (super) в python 2.7
Сообщение15.09.2018, 11:37 
Аватара пользователя
EtCetera, спасибо большое, я понял. А что, в определении родительского класс в скобках кроме object может быть другое какое-то слово? В чем смысл этого?

 
 
 
 Re: Наследование (super) в python 2.7
Сообщение15.09.2018, 16:28 
В Python 3.6 можно использовать super и без аргументов. В 2.7 не пробовал, но Вы можете попробовать.

 
 
 
 Re: Наследование (super) в python 2.7
Сообщение15.09.2018, 17:03 
Аватара пользователя
leon_ard в сообщении #1339174 писал(а):
В Python 3.6 можно использовать super и без аргументов. В 2.7 не пробовал, но Вы можете попробовать.

В версии 2.7 так делать нельзя.

 
 
 [ Сообщений: 5 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group