OOP (Object Oriented Programming)

Réussis tes devoirs et examens dès maintenant avec Quizwiz!

Когда мы используем наследование?

Prefer composition over inheritance. Наследование стоит использовать только для наследования ИНТЕРФЕЙСОВ. В остальных случаях стоит задуматься о композиции.

Для чего используется @property?

- можно указать, что это свойство только для чтения - реализовать сеттеры, геттеры и делитеры

Зачем используется __new__?

o __new__(cls[, ...]) - вызывается для создания нового экземпляра класса

Объект

экземпляр класса

Что такое атрибуты экземпляров класса?

Атрибуты объектов-экземпляров делятся на два типа: атрибуты-данные и методы.

Декоратор @

это функция, которая позволяет обернуть другую функцию для расширения её функциональности без непосредственного изменения её кода.

Абстрагирование

это способ выделить набор значимых характеристик объекта, исключая из рассмотрения незначимые

Dependency Injection

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

Для чего используется @staticmethod?

Staticmethods используются для группировки функций, которые имеют некоторую логическую связь с классом класса.

getattr

The getattr() method returns the value of the named attribute of an object. If not found, it returns the default value provided to the function. print('The age is:', getattr(person, "age")) print('The age is:', person.age)

Что такое утиная типизация?

The idea is that it doesn't actually matter what type my data is - just whether or not I can do what I want with it.

Что делает __call__?

__call__ вызывается при обращении к экземпляру как к функции. Это не повторяющееся определение — если метод __call__ присутствует, интерпретатор будет вызвать его, когда экземпляр вызывается как функция, передавая ему любые позиционные и именованные аргументы, используется для создания класса-декоратора.

Что такое property в python?

define a method, but access like an attribute, make getters, setters and deleters

How to avoid writing a long if statements?

getattr

Что такое MRO?

method resolution order - порядок разрешения методов. Который позволяет построить устойчивый список из самого класса и всех его предков

Что делает __bool__?

o __bool__(self) (в Python 2 - __nonzero__(self)) - вызывается функцией bool() и при использовании объекта в условиях;

Зачем нужен __del__?

o __del__(self) - деструктор - вызывается перед удалением объекта; __del__ это его деструктор. Он не определяет поведение для выражения del x (поэтому этот код не эквивалентен x.__del__()). Скорее, он определяет поведение объекта в то время, когда объект попадает в сборщик мусора.

Зачем используют __format__?

o __format__(self, format_spec) - вызывается функцией format для получения форматированной строки согласно параметрам format_spec;

Что делает __getattr__ и в чем отличие от __getattribute__?

o __getattr__(self, name) - в отличие от__getattribute__, вызывается только когда атрибут не найден; если класс реализует __getattribute__, вызывается только если __getattribute__ вызовет его явно или сгенерирует исключение AttributeError; o Метод __getattribute__ вызывается, когда мы пытаемся получить любой атрибут, не зависимо от того, есть он или нет. Этот метод, вызывается прежде __getattr__. Он немного хитрее. Если __getattribute__ кидает AttributeError, то будет вызвана __getattr__.

С помощью какого метода можно получить доступ к атрибутам экземпляра?

o __getattribute__(self, name) - вызывается для получения доступа к атрибутам экземпляров класса, может (вместе с __setattr__) использовать для реализации полноценной инкапсуляции;

Какой магический метод возвращает хеш-значение объекта?

o __hash__(self) - вызывается функцией hash() для получения числа - хеш-значения объекта;

Зачем нужен __init__?

o __init__(self[, ...]) - вызывается после создания нового экземпляра класса; аргументы этого метода совпадают с параметрами, которые указываются при инстанцировании класса;

Какой магический метод используется при вызове функции len()?

o __len__(self) - вызывается функцией len();

Назовите магические методы, которые определяют логику сравнения

o __lt__(self, other), __le__(self, other), __eq__(self, other), __ne__(self, other), __gt__(self, other), __ge__(self, other) - определяют операции сравнения <, <=, ==, !=, >, >=;

С помощью каких методов определяем сеттер и деллитер?

o __setattr__(self, name, value) - используется для присваивания значений атрибутам; o __delattr__(self, name) - вызывается при удалении атрибутов.

Инкапсуляция

свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе, и скрыть детали реализации

Полиморфизм

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

Метаклассы

это классы, экземпляры которых являются классами

Композиция

это концепция, которая моделирует отношения. Она позволяет создавать сложные типы, комбинируя объекты других типов. В композиции класс, известный как составной, содержит объект другого класса, известный как компонент. Другими словами, составной класс имеет компонент другого класса.

Состояние

это поведенческий паттерн проектирования, который позволяет объектам менять поведение в зависимости от своего состояния. Извне создаётся впечатление, что изменился класс объекта.

Наследование

это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью.

Парадигма программирования

это совокупность идей и понятий, определяющих стиль написания компьютерных программ (подход к программированию)

Как сделать класс неизменяемым?

- одним из вариантом будет создание propety, если определены property только на чтение, то нельзя будет обновить атрибут. - dataclass with frozen=true

В чем разница между декларативным подходом и императивным?

1. Императивный ответ: «Пройди через северный выход парковки и поверни налево. Сядь на автобус 678 и выйди на остановке «Улица Победы». Поверни направо, как если бы ты шёл в Икею. Иди прямо и поверни направо у первого светофора. На следующем светофоре поверни налево. Номер моего дома — 134.» Императивный подход означает то, как вы займёте место. Вы должны перечислить все шаги этого процесса. 2. Декларативный ответ: Мой адрес: Энск, улица Победы, дом 134. Используем функции высшего порядка.

В чем же проблема наследования?

1. При наследовании мы получаем все методы родительского класса, которые, возможно, не нужны. Использовать будем только пару из них. 2. Наследование приводит с сильному coupling классов, что является не очень желательным.

__init_subclass__

It's used to let the parent know when it is being subclassed. An __init_subclass__ hook that initializes all subclasses of a given class.

Что такое атрибуты класса?

Поля и методы класса

В чем отличие обычных классов от классов, созданных с помощью __metaclass__ = abc.ABCMeta?

• Во-первых, если в абстрактном классе объявляются методы или свойства с использованием декораторов @abstractmethod и @abstractproperty, описываемых ниже, то экземпляры производных классов не могут быть созданы, если эти классы не имеют неабстрактных реализаций этих методов и свойств. • Во-вторых, абстрактные классы обладают методом класса register(subclass), который может использоваться для регистрации дополнительных типов как логических подклассов. Для любого подкласса, зарегистрированного с помощью этого метода, вызов isinstance(x, AbstractClass) будет возвращать True, если x является экземпляром этого подкласса. • Наконец, абстрактные классы могут объявлять специальный метод класса __subclasshook__(cls, subclass). Этот метод должен возвращать True, если тип класса subclass может считаться подклассом класса cls, False - если класс subclass не является подклассом cls, или возбуждать исключение NotImplemented, если невозможно сделать никаких предположений о принадлежности класса subclass к иерархии.

Какие бывают типы атрибутов объектов-экземпляров ?

атрибуты-данные и методы

Зачем используется super()?

super позволяет получить доступ к предыдущему классу в цепочке MRO (method resolution order - порядок разрешения методов), которая в случае простого наследования выглядит так же, как и цепь наследования, а в случае множественного наследования строится интерпретатором при помощи алгоритма C3-линеаризации, который позволяет построить устойчивый список из самого класса и всех его предков (родителей и прородителей) в котором по порядку слева направо будет производиться поиск метода (линеаризация класса), такой что в линеаризации класса-потомка соблюдается тот же порядок следования классов-прородителей, что и в линеаризации класса-родителя (свойство монотонности), и в линеаризации класса-потомка соблюдается тот же порядок следования классов-родителей, что и в его объявлении (свойство локального старшинства).

Можно ли выполнять код внутри класса?

the body of a class executes as a script, you can include imports, for loops etc. body class = eval(body)

Основные принципы ООП

Абстракция Инкапсуляция - encapsulation Наследование - inheritance Полиморфизм - polymorphism

Что делает __bases__?

Атрибут класса __bases__ хранит кортеж (неизменяемый список) базовых классов.

Что в Python не является объектом?

В Python всё является объектами - экземплярами каких-либо классов, даже сами классы, которые являются объектами - экземплярами метаклассов. Главным метаклассом является класс type, который является абстракцией понятия типа данных.

Как используется полиморфизм в таком примере: 5*6 и 'hello'*6

В Python, эти конструкции превращаются в 5.__mul__(6) и 'hello'.__mul__(6). В первом случае мы получим в ответе 30, а во втором - hellohellohellohellohellohello. Полиморфизм проявляется таким образом, что в зависимости от аргументов, функция или метод будут выполняться по-разному.

Что такое полиморфизм подтипов?

В объектно-ориентированном программировании полиморфизм подтипов (или полиморфизм включения) представляет собой концепцию в теории типов, предполагающую использование единого имени (идентификатора) при обращении к объектам нескольких разных классов, при условии, что все они являются подклассами одного общего надкласса (суперкласса). Полиморфизм подтипов состоит в том, что несколько типов формируют подмножество другого типа (их базового класса) и потому могут использоваться через общий интерфейс. Если класс B наследуется от класса А, то любой экземпляр класса B можно использовать там, где ожидается экземпляр класса А.

Как задать функции поведение, чтобы она работала только с дочерними объектами определенного класса?

В родителе определить метод init_subclass. @classmethod def__init_subclass__(cls):BaseClass.registry[cls.__name__] = cls msgcls = BaseClass.registry.get(msgtype)if not msgcls:raise RuntimeError(f"Bad message type {msgtype}")

Приведите пример аналогии из жизни Паттерна Состояние

Ваш смартфон ведёт себя по-разному, в зависимости от текущего состояния: - Когда телефон разблокирован, нажатие кнопок телефона приводит к каким-то действиям. - Когда телефон заблокирован, нажатие кнопок приводит к экрану разблокировки. - Когда телефон разряжен, нажатие кнопок приводит к экрану зарядки.

Опишите порядок разрешения доступа к атрибутам obj.field

Вызов obj.__getattribute__('field'), если он определен. При установке или удалении атрибута проверяется соответственно наличие __setattr__ или __delattr__. Поиск в obj.__dict__ (пользовательские атрибуты). Поиск в object.__class__.__slots__. Рекурсивный поиск в поле __dict__ всех родительских классов. Если класс имеет несколько предков, порядок проверки соответствует порядку их перечисления в определении. Если определен метод __getattr__, то происходит вызов obj.__getattr__('field') Выбрасывается исключение несуществующего атрибута - AttributeError. Наконец, когда атрибут нашелся, проверяется наличие метода __get__ (при установке - __set__, при удалении - __delete__).

Объектно-ориентированное программирование (ООП)

парадигма программирования, в которой основными концепциями являются понятия объектов и классов

Поля данных

параметры объекта (конечно, не все, а только необходимые в программе), задающие его состояние (свойства объекта предметной области)

Зачем используется декоратор abstractmethod(method) и abstractproperty?

Декоратор, который объявляет метод method абстрактным. Когда этот декоратор используется в абстрактном базовом классе, классы, непосредственно объявленные как производные этого базового класса, могут использоваться для создания экземпляров, только если они включают неабстрактное определение метода method. Этот декоратор не оказывает влияния на подклассы, зарегистрированные с помощью метода register() абстрактного базового класса. Создает абстрактное свойство. Этот декоратор принимает те же аргументы, что и обычная функция property(). Когда этот декоратор используется в абстрактном базовом классе, классы, непосредственно объявленные как производные этого базового класса, могут использоваться для создания экземпляров, только если они включают неабстрактное определение свойства.

Для чего нужны @classmethod, @staticmethod, @property?

Декораторы @classmethod, @staticmethod и @property используются для функций, определенных в классах.

Разница между bound и unbound methods?

Если в Python 3 функция-атрибут - просто функция. Метод хранит в себе ссылку на экземпляр и функцию. В Python 2- instance method. im_class - ссылка на класс, в котором опр. метод im_func - ссылка на функцию im_self - ссылка на экземпляр. Если im_self - None, то метод unbound. Если кратко: Несвязанные методы класса: без аргумента self Попытка обращения к функциональному атрибуту класса через имя класса возвращает объект несвязанного метода. Чтобы вызвать этот метод, необходимо явно передать ему объект экземпляра в виде первого аргумента. В Python 3.0 несвязанные методы напоминают простые функции и могут вызываться через имя класса. Связанные методы экземпляра: пара self + функция Попытка обращения к функциональному атрибуту класса через имя экземпляра возвращает объект связанного метода. Интерпретатор автоматически упаковывает экземпляр с функцией в объект связанного метода, поэтому вам не требуется передавать экземпляр в вызов такого метода.

Получение доступа к атрибутам суперкласса

Если в данном классе метод или атрибут был переопределён, а требуется доступ к соответствующему атрибуту суперкласса, это можно совершить двумя способами: 1) путём явного обращения к атрибуту необходимого класса: BaseClass.method(self) 2) при помощи инстанцирования специального прокси-объекта класса super В Python3 можно не указывать ничего и данные параметры будут получены автоматически: super().method() # то же самое, что super(__class__, self).method() В Python2 как параметры конструктора superпередаются имя текущего класса и ссылка на экземпляр текущего класса: super(MyClass, self).method()

Как понять, что использования класса излишне?

Если в классе 2 метода, и один из них __init__, то это не класс. Всегда можно переписать в эквивалент функции. class Greeting: def __init__(self, greeting='hola'): self.greeting=greeting def greeting(self, name): return f'{self.greeting}! {name}' def greet(greeting, target): return f'{self.greeting}! {name}' greet = functools.partial(greet, 'hola')

В чем недостатки реализации State Machine через if/else or switch?

Машину состояний чаще всего реализуют с помощью множества условных операторов, if либо switch, которые проверяют текущее состояние объекта и выполняют соответствующее поведение. Основная проблема такой машины состояний проявится в том случае, если в Сущность добавить ещё десяток состояний. Каждый метод будет состоять из увесистого условного оператора, перебирающего доступные состояния. Такой код крайне сложно поддерживать.

Зачем использовать метаклассы?

Метаклассы - это магия, о которой 99% пользователей не стоит даже задумываться. Если вам интересно, нужны ли они вам - тогда точно нет. Люди, которым они на самом деле нужны, знают, зачем, и что с ними делать

Модуль abc

Модуль abc объявляет метакласс и пару декораторов, с помощью которых определяются новые абстрактные базовые классы. ABCMeta - Метакласс, являющийся представлением абстрактного базового класса.

Процедурное программирование

программирование на императивном языке, при котором последовательно выполняемые операторы можно собрать в подпрограммы

Методы

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

Как должно работать правильное ООП?

ООП полностью посвящено объектам. Объекты отвечают (или должны отвечать) на сообщения, и когда вы хотите что-то сделать - вы посылаете объекту сообщение, а уж как он обработает его — совершенно не важно. Думайте об объектах как о "черных ящиках", и когда вы что-то хотите от них — просто посылайте сообщения, а они вам будут слать сообщения в ответ.

Mixin

Одним из применений множественного наследования в Python является расширение возможностей класса с помощью миксинов (mixins). Mixin - это класс, который предоставляет методы другим классам, но не считается базовым классом.

Что такое специальные («магические») методы?

Они задают особое поведение объектов и позволяют переопределять поведение встроенных функций и операторов для экземпляров данного класса.

Когда применяется __getitem__(self, key)?

Определяет поведение при доступе к элементу, используя синтаксис self[key]. Тоже относится и к протоколу изменяемых и к протоколу неизменяемых контейнеров. Должен выбрасывать соответствующие исключения: TypeError если неправильный тип ключа и KeyError если ключу не соответствует никакого значения или IndexError, если ключ выходит за пределы поддерживаемых ключей (в том числе, после интерпретации отрицательных значений).

Когда применяется __setitem__(self, key, value)?

Определяет поведение при присваивании значения элементу, используя синтаксис self[nkey] = value. Часть протокола изменяемого контейнера. Опять же, вы должны выбрасывать KeyError и TypeError в соответсвующих случаях.

Как в unittests проверить, что была вызвана ошибка?

Очевидно, чтобы assertRaises работал, вызов функции должен содержаться в какой-то оболочке, чтобы перехватить исключение. Если он просто запускается напрямую, функция просто выполняется сама по себе, исключение не перехватывается, и вместо этого контрольный пример становится ошибкой. with self.assertRaises(Exception): func()

Паттерн Состояние

Паттерн Состояние предлагает создать отдельные классы для каждого состояния, в котором может пребывать объект, а затем вынести туда поведения, соответствующие этим состояниям.

Зачем используется __slots__?

По умолчанию классы используют словарь для хранения атрибутов — это позволяет модифицировать набор атрибутов объекта прямо в ходе исполнения программы. Однако такой подход оказывается затратным для объектов, набор атрибутов которых невелик и/или ограничен. Это становится особенно заметно, когда создаётся большое количество экземпляров. С помощью __slots__ можно зафиксировать множество возможных атрибутов экземпляра. Экземпляры класса с указанным __slots__ требуют меньше памяти, потому что у них отсутствует __dict__ Область действия слотов ограничено классом, в котором они определены, поэтому наследники (если конечно они не определили собственные слоты) будут иметь __dict__.

Какой полиморфизм используется в Python?

Полиморфизм подтипов, параметрический и специальный (ad hoc) используется в статических языках. При динамической типизации полиморфизм является побочным эфектом. В Python используется полиморфизм подтипов и частично параметрический.

Почему колоночное представление занимает меньше памяти, чем строчное?

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

functools.wraps

Применяя этот декоратор «wraps» к нашей внутренней функции, мы копируем имя, строку документации и сигнатуру функции в нашу внутреннюю функцию

Назовите примеры полиморфизма в Python

Простейшим примером использования полиморфизма является функция print,которая вызывает у переданного ей объекта метод __str__. print('str') print(42)

Какой метод мы используем для проверки типов?

Существует 2 метода: type() и isinstance(). Для проверки типов используем ТОЛЬКО isinstance(). Если передать в type() подкласс значения, то будет вызвана ошибка, isinstance - отработает правильно, он поддерживает наследование.

Назовите виды полиморфизма

Существует несколько видов полиморфизма. Два наиболее различных из них были описаны Кристофером Стрэчи в 1967 году: это специальный полиморфизм (или «ad hoc полиморфизм») и параметрический полиморфизм. Кратко специальный полиморфизм описывается принципом «много реализаций с похожими интерфейсами», а параметрический полиморфизм — «одна реализация с обобщённым интерфейсом».

Как создать собственный метакласс?

Чтобы создать свой собственный метакласс в Python, нужно воспользоваться подклассом type, стандартным метаклассом в Python. Чаще всего метаклассы используются в роли виртуального конструктора. Чтобы создать экземпляр класса, нужно сначала вызвать этот самый класс. Точно так же делает и Python: для создания нового класса вызывает метакласс. Метаклассы определяются с помощью базовых классов в атрибуте __metaclass__. При создании класса допускается использование методов __init__ и __new__. С их помощью можно пользоваться дополнительными функциями. Во время выполнения оператора class генерируется пространство имен, которое будет содержать атрибуты будущего класса. Затем, для непосредственного создания, вызывается метакласс с именем и атрибутами.

Observer Pattern

Это поведенческий паттерн проектирования, который создаёт механизм подписки, позволяющий одним объектам следить и реагировать на события, происходящие в других объектах. Python decorators used in the way I showed above are nothing more than a really nice way to implement this pattern!

Как реализован private в python?

атрибуты, имена которых начинаются, но не заканчиваются, двумя символами подчёркивания, считаются приватным

Динамическое связывание (полиморфизм)

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

Как создать классовый метод и какой 1 аргумент должен быть передан?

для создания методов класса используется декоратор classmethod. В таких методах первый параметр принято называть не self, а cls.

Какая единственная операция для объектов-экземпляров?

доступ к их атрибутам и методам

Императивное программирование

императивная программа очень похожа на приказы, выражаемые повелительным наклонением в естественных языках, то есть это последовательность команд, которые должен выполнить компьютер. Императивный подход означает то, как вы займёте место. Вы должны перечислить все шаги этого процесса.

Структурное программирование

методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков

Класс

модель ещё не существующей сущности (объекта). Фактически он описывает устройство объекта, являясь своего рода чертежом Фрукт - класс, яблоки, груша - объект

Какие операции поддерживает класс?

обращение к атрибутам классов и создание (инстанцирование) объектов - экземпляров класса (instance objects)

Дескрипторы в python

объект, предоставляющий значение атрибута. За чем реализации __get__(), __set__(), __delete__() он может подменять механизмы доступа к атрибутам и влиять на выполнение этих операций. Основная идея заключается в том, что атрибуту класса назначается экземпляр другого класса специального вида. Этот специальный класс - класс дескриптора - это класс нового типа, имеющий методы .__get__(), .__set__() и __delete__() (или по крайней мере некоторые из них). Если класс дескриптора реализует по меньшей мере первые два метода, он называется изменяемым дескриптором (data descriptor); если же реализован только первый метод, он называется неизменяемым дескриптором (non-data descriptor).


Ensembles d'études connexes

Elementos del proceso de comunicación - clase 8º

View Set

Long term effects of smoking Tobacco(20)

View Set

Acid Base Balance, AKD and CKD NCLEX Questions

View Set

Chapter 13: Metals, Paint & Soil

View Set