Я почти исследовал все ключевые концепции ООП вчера. Сегодня я прошел через оставшиеся биты и куски объектных ориентированных концепций программирования и их реализации в Python. Наряду с этим я попытался включить некоторые практические упражнения кода, которые включают в себя общее использование концепций ООП в Python, чтобы вспомнить все концепции от умственной модели, которая была разработана.
супер()
супер
Зарезервированное слово в Python (был введен в Python V 2.2), который входит в действие во время наследования. Когда подкласс или детский класс, который наследует от родительского класса и должен вызывать метод родительского класса, он использует супер
Отказ Я знаю, что это звучит довольно сбивает с толку. Так вот пример
- Без использования
супер
class Employee: def __init__(self, name): self.name = name print(f'{self.name} is an employee') class Manager(Employee): def __init__(self, department, name): self.department = department self.name = name Employee.__init__(self, name) print(f'Manager, {self.department} department') staff_1 = Manager('HR', 'Andy') # Andy is an employee # Manager, HR department
Здесь __init__
Метод конструктора родительского класса называется явно используя имя родительского класса, а затем Я
Объект пропускается как первый параметр.
- Использование
супер
(Компактный синтаксис – нет необходимости проходитьSelf
)
class Employee: def __init__(self, name): self.name = name print(f'{self.name} is an employee') class Manager(Employee): def __init__(self, department, name): self.department = department self.name = name super().__init__(name) print(f'Manager, {self.department} department') staff_1 = Manager('HR', 'Andy') # Andy is an employee # Manager, HR department
Как и метод конструктора, показанный в вышеуказанном коде, любой метод родительского класса может быть вызван внутри ребенка, используя супер()
В JavaScript синтаксис более Compact, где супер
называется как Super (параметр) . Но мне также нравится синтаксис Python. Это более четко о вызове __init__
Способ использования супер
Отказ
Самоанализ
Python может оценить тип объекта (все в Python – это объект) во время выполнения. Это означает, что интерпретатор способен понимать, каковы свойства и методы объекта и их доступность во время выполнения динамически. Это называется самоанализ Отказ
Python предоставляет встроенную функцию Dir
интроспективать объект.
class Developer: def __init__(self, name, language): self.name = name self.language = language def introduce(self): print(f'Hi! I am {self.name}. I code in {self.language}') dev = Developer('Matt', 'Python') print(dir(dev)) # Try this in any Python REPL
Дундер методы
В Python классы могут быть сделаны более мощными, определяя некоторые магические методы, называемые Дундер Методы Отказ Дунты – это короткое имя для Двойной под Отказ Эти методы префиксированы и суффиксируются двойными подчеркиваниями __
Отказ Эти специальные методы предопределены в Python для конкретных случаев использования. Например, мы можем получить доступ к встроенной функции, потому что она определяется как специальный метод Dunder __leen__
Отказ
При создании класса эти методы Dunder могут использоваться для моделирования поведения встроенных типов.
class Sentence: words = [] def add_word(self, word): self.words.append(word) def __len__(self): return len(self.words) new_sentence = Sentence() new_sentence.add_word('Hello') new_sentence.add_word('World') print(len(new_sentence))
Я изменил класс предложений, чтобы мы могли использовать встроенный метод Лен
который недоступен по умолчанию для реализации пользовательской логики. Дундерные методы кажутся довольно удобными!
Многократное наследование
Класс для наследства свойств и методов из нескольких классов по нескольким наследству. Это мощная концепция, но также имеет свои предостережения. По сравнению с JavaScript Ulane, множественное наследование там не поддерживается.
class Batsman: def swing_bat(self): return 'What a shot!' class Bowler: def bowl_bouncer(self): return 'What a bouncer!' class AllRounder(Batsman, Bowler): pass player = AllRounder() print(player.bowl_bouncer()) # What a shot! print(player.swing_bat()) # What a bouncer!
Он может получить немного сложное, когда родительские классы имеют методы конструктора, которые требуют инициализации. В дочернем классе все методы унаследованного класса должны быть инициализированы.
class Batsman: def __init__(self, hitting_power): self.hitting_power = hitting_power def swing_bat(self): return f'Shot with power {self.hitting_power}' class Bowler: def __init__(self, delivery_speed): self.delivery_speed = delivery_speed def bowl_bouncer(self): return f'Bowled with speed of {self.delivery_speed} kmph' class AllRounder(Batsman, Bowler): def __init__(self, hitting_power, delivery_speed): Batsman.__init__(self, hitting_power) Bowler.__init__(self, delivery_speed) player = AllRounder(90, 80) print(player.swing_bat()) print(player.bowl_bouncer())
Порядок разрешения метода
Порядок разрешения метода или MRO короче говоря, является порядок, в котором свойства и методы наследуются в Python.
При наследовании из нескольких классов свойства и методы унаследованы дочерним классом в конкретной иерархии. Основной алгоритм, который реализует это в Python, использует Глубина первый поиск алгоритм Отказ
class Employee: secret_code = 'secret' class Manager(Employee): secret_code = 'm123' class Accountant(Employee): secret_code = 'a123' class Owner(Manager, Accountant): pass person = Owner() print(person.secret_code) # m123
Чтобы узнать порядок наследования, Python предоставляет метод MRO
Это можно призвать на объекте для просмотра иерархии наследования
print(Owner.mro()) # try in a python console with above code to see the result
Многочисленные наследования могут быть трудно понять, поэтому этот шаблон обычно не используется на практике. Это то, что я читаю в нескольких статьях.
Это все на сегодня!
Наконец сделано с объектно-ориентированными концепциями программирования в Python. Цель состоит в том, чтобы реализовать эти принципы, когда я начинаю строить реальные проекты Python после окончания этой проблемы.
Я надеюсь, что смог укрыть все ключевые концепции ориентированных на объект, ориентированные на программирование в Python и поделитесь его, не очень сложным.
Видео я в настоящее время смотрю
Завтра окунусь на территорию Функциональное программирование в питоне. Это будет довольно интересно. Хотя Python, в целом, является процессуальным языком и популярен для своих объектно-ориентированных концепций, будет изучать, как функциональные концепции программирования стилей могут быть реализованы в Python для остальной части этой недели.
Иметь отличный!
Оригинал: “https://dev.to/arindamdawn/30-days-of-python-day-10-oop-missing-pieces-29fl”