Рубрики
Без рубрики

Введение в Python Super С примерами

Python super используется для создания прокси-сервера или временного объекта суперкласса в подклассе. Это позволяет подклассу получить доступ к методам суперкласса

Автор оригинала: 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() сделать код удобным для разработчика и пользователя. Это позволяет так легко получить доступ к методам внутри суперкласса неявно из подкласса.

Попробуйте запустить программы на вашей стороне и дайте мне знать, если у вас есть какие-либо вопросы.

Счастливого кодирования!