Инструменты пользователя

Инструменты сайта


python:oop:polimorfizm

Полиморфизм

Полиморфизм является возможностью использовать один и тот же интерфейс для различных базовых форм, таких как типы данных или классы. Это позволяет функции использовать объекты разных типов в разные моменты времени.

Для того, чтобы использовать полиморфизм, мы собираемся создать два различных класса для использования с двумя различными объектами. Каждый из этих различных классов должен иметь интерфейс, в общем, так что они могут быть использованы полиморфно, поэтому мы дадим им методы, которые отличаются, но имеют такое же имя.

app/lessonImport41/Person.py

class Person:
    outString = ''
 
    def __init__(self, name = 'Серега', age = 18):
        self.name = name
        self.age = 20 # инкапсуляция типа private
 
    def printInfo(self):
        self.outString = f'Зовут {self.name} ему {self.age} лет'
        return self
 
    def print(self):
        print(self.outString)
 
    def __str__(self):
        '''
        Переопределяем метод из глобального класса
 
        В данном случаем выводим название класса в которм будеи вызван метод
        '''
        return f'Name: {self.__class__}'

app/lessonImport41/Employee.py

from app.lessonImport41.Person import Person
 
class Employee(Person):
 
    def __init__(self, name, age, company):
        super().__init__(name, age)
        self.company = company
 
    def printInfo(self):
        super().printInfo()
        self.outString += f' компания {self.company}'
        return self

В приведенном выше коде, классы Person и Employee имеют два метода с тем же общем именем. Тем не менее, каждая функциональная возможность этих методов различны для каждого класса

from app.lessonImport41.Employee import Employee
 
employee = Employee('Женя', 30, 'Ашан')
employee.printInfo().print()
 
print(employee.__str__())

Результат:

Зовут Женя ему 20 лет компания Ашан
Name: <class 'app.lessonImport41.Employee.Employee'>

super()

озвращает объект-посредник (прокси), делегирующий вызовы методов родителю или собрату класса указанного типа.

super([type[, object-or-type]]) 

type : Тип, от которого следует начать поиск объекта-посредника. 3.0 Ранее атрибут был обязателен.

obj-or-type : Если не указан, возвращается несвязанный объект-посредник. Если атрибут является объектом, то будет получен посредник для получения метода объекта, для которого isinstance(obj, type) возвращает True. Если атрибут является типом, то будет получен посредник для получения метод класса, для которого issubclass(subtype, type) возвращает True.

Используется для доступа к базовым реализациям наследуемых методов, перекрытых в классе-наследнике.

python/oop/polimorfizm.txt · Последние изменения: 2023/01/12 12:18 (внешнее изменение)