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

30 дней Python 👨💻 – 10-й день – OOP отсутствующие части

Я почти исследовал все ключевые концепции ООП вчера. Сегодня я прошел через оставшиеся биты и пирог … Теги с Python, Challenge.

Я почти исследовал все ключевые концепции ООП вчера. Сегодня я прошел через оставшиеся биты и куски объектных ориентированных концепций программирования и их реализации в 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”