Автор оригинала: Team Python Pool.
Введение в Python Super С примерами
Мы все должны были использовать наследование в какой-то момент времени или, по крайней мере, слышали, насколько полезен любой объектно-ориентированный язык программирования. Он позволяет одному классу (производному классу) получить все свойства родительского (базового) класса. Производный класс может получить доступ к переменным базового класса, методам. А чтобы получить доступ к методам базы внутри производного класса, у нас есть python super method.
Этот метод Python super() является встроенным методом, который создает прокси-объект (временный объект) внутри производного класса. Чтобы лучше понять его, мы можем думать о нем как о способе доступа к методам суперкласса(базы) из производного класса. Если вы думаете о том, что мы будем делать, получая доступ к этим методам, поверьте мне, все зависит от нашего воображения, насколько хорошо мы его используем. И на этот вопрос вы наверняка ответите в конце этой статьи.
Python Super на разных уровнях наследования
Ниже приведены различные уровни наследования с использованием super –
1. Python super() в одиночном наследовании
При одиночном наследовании существует только один базовый класс и один производный класс. А в Python каждый класс имеет конструктор с именем __init__. Чтобы узнать больше о __init__, обратитесь к этой статье – http://pythonpool.com/init-python/
class Vehicle: def __init__(self,name,gear,model):
class Car(Vehicle): def __init__(self,name,gear,model,types): # calling the __init__ method of the superclass super().__init__(name,gear,model)
Output- The number of gear in car1 5 Car1 model year 2010 Type of car1 hatchback The number of gear in car2 5 Car2 model year 2003 Type of car2 Sedan
Мы тоже можем это сделать-
class Vehicle: def __init__(self,name,gear,model):
class Car(Vehicle): def __init__(self,name,gear,model,types): # calling the__init__ method of the superclass Vehicle.__init__(self,name,gear,model)
Output-
The number of gear in car1 5
Car1 model year 2010
Type of car1 hatchback
The number of gear in car2 5
Car2 model year 2003
Type of car2 Sedan
Но предположим, что мы хотим изменить родительский класс, скажем, на класс с именем four-wheelers. И если бы мы использовали второй подход, нам пришлось бы менять его везде, где мы использовали транспортное средство.__init__(). Таким образом, использование super-это лучший доступный вариант.
Примечание – super() имеет два параметра. Если мы не будем оценивать эти параметры, то значения по умолчанию здесь будут super(Car, self). Здесь первым аргументом является подкласс, а вторым-экземпляр подкласса.
2. Python в многоуровневом наследовании
Существует базовый класс A, производный класс B, который является базовым классом для C и производным классом C в многоуровневом наследовании. Здесь мы можем создать программу, которая вычислит возраст отца и деда(Обратите внимание, что здесь мы предположили, что возраст отца на 25 больше, чем ребенка, а возраст деда на 25 больше, чем отца.) Это довольно нереалистичный пример, но я думаю, что он поможет вам лучше понять работу super ().
class GrandFather: def __init__(self): print('GrandFather born') def calculate_age(self, age): print('Age of GrandFather', age) class Father(GrandFather): def __init__(self): super().__init__() print('Father born') def calculate_age(self, age): super().calculate_age(age + 25) print('Age of Father', age) class Child(Father): def __init__(self): super().__init__() print('Child born') def calculate_age(self, age): super().calculate_age(age + 25) print('Age of Child:', age) () c.calculate_age(18)
Output- GrandFather born Father born Child born Age of GrandFather 68 Age of Father 43 Age of Child: 18
3. Python Super() в множественном наследовании
При множественном наследовании мы имеем один производный класс и более одного базового. Например, ребенок получает свойства от матери и отца. Теперь давайте посмотрим, как super() может помочь нам в нескольких href="https://en.wikipedia.org/wiki/Inheritance_(объектно-ориентированное программирование)">Наследование. href="https://en.wikipedia.org/wiki/Inheritance_(объектно-ориентированное программирование)">Наследование.
class Animal: def __init__(self, name): print(name, 'is an animal.') class CannotFly(Animal): def __init__(self,name): print(name, "cannot fly.") super().__init__(name) #Cat derives the property of animal and those type of animals #that cannot fly class Cat(CannotFly,Animal): def __init__(self): print('I am a cat.'); super().__init__('Cat')()
Output I am a cat. Cat cannot fly. Cat is an animal. Method Resolution Order
Порядок разрешения Метода
Порядок разрешения методов или MRO помогает Python определить порядок, в котором будет происходить выполнение унаследованных методов. Это очень удобно, когда мы используем super (), потому что MRO точно сообщает Python, где искать метод, который мы вызываем с помощью super (), и в каком порядке. Для этой цели мы можем использовать атрибут __more__.
Давайте рассмотрим тот же пример из предыдущего раздела.
class Animal: def __init__(self, name): print(name, 'is an animal.') class CannotFly(Animal): def __init__(self,name): print(name, "cannot fly.") super().__init__(name) #Cat derives the property of animal and those type of animals #that cannot fly class Cat(CannotFly,Animal): def __init__(self): print('I am a cat.'); super().__init__('Cat')() print(Cat.mro)
Output-
(main.Cat, main.CannotFly, main.Animal, object)
Это ясно показывает, что первый метод внутри класса Cat будет вызван, затем будет вызван метод внутри класса CannotFly и, наконец, будет вызван метод внутри класса Animal.
Должен Читать
- Как преобразовать строку в нижний регистр в
- Как вычислить Квадратный корень
- Пользовательский ввод | Функция ввода () | Ввод с клавиатуры
- Лучшая книга для изучения Python в 2020 году
Вывод
Из всего, что мы обсуждали до сих пор, мы должны были понять, насколько важно python super() сделать код удобным для разработчика и пользователя. Это позволяет так легко получить доступ к методам внутри суперкласса неявно из подкласса.
Попробуйте запустить программы на вашей стороне и дайте мне знать, если у вас есть какие-либо вопросы.
Счастливого кодирования!