Multiple inheritance and mixins
Наследование ООП
Магич. методы в ООП
Магич. методы в ООП
OOP: Polymorphism
OOP: Polymorphism
100

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

вы можете использовать функцию mro() или атрибут __mro__

mro() - []

__mro__ - ()

100

1. Что такое наследование? 

2. Что выведет данный код?

class Person:

def __init__(self, name, age):

self.__name = name # устанавливаем имя

self.__age = age # устанавливаем возраст

@property

def age(self):

return self.__age

@age.setter

def age(self, age):

if age in range(1, 100):

self.__age = age

else:

print("Недопустимый возраст")

@property

def name(self):

return self.__name

def display_info(self):

print("Имя:", self.__name, "\tВозраст:", self.__age)


class Employee(Person):

def details(self, company):

# print(self.__name, "работает в компании", company) # так нельзя, self.__name -

приватный атрибут

print(self.name, "работает в компании", company)


tom = Employee("Tom", 23)

tom.details("Google")

tom.age = 33

tom.display_info()

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

2. Traceback (most recent call last):

  File "/home/erlan/qa/qa.py", line 201, in <module>

    tom.details("Google")

  File "/home/erlan/qa/qa.py", line 197, in details

    print(self.__name, "работает в компании", company) # так нельзя, self.__name - приватный атрибут

AttributeError: 'Employee' object has no attribute '_Employee__name'

100

Что делает метод issubclass?

Что делает метод isinstance?

1. проверка подкласса 

2. проверка метода

100

Что такое __getitem__, __setitem__, __delitem__?

1.  Вызывается, когда вы пытаетесь получить элемент объекта по индексу или ключу.

2.

  • Вызывается, когда вы пытаетесь установить значение элемента объекта по индексу или ключу.
  • Параметры:
    • self: ссылка на экземпляр объекта.
    • key: индекс или ключ, по которому вы пытаетесь установить значение.
    • value: значение, которое вы хотите установить.

3. 

  • Вызывается, когда вы пытаетесь удалить элемент объекта по индексу или ключу.
  • Параметры:
    • self: ссылка на экземпляр объекта.
    • key: индекс или ключ, по которому вы пытаетесь удалить элемент.
100

3) Чем удобен метод полиморфизм? Где его можно применить?

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

в методах 

200

Что такое проблема ромба?

Проблема ромба (или ромбовидное наследование) возникает когда класс наследует от двух классов, которые сами являются потомками одного и того же базового класса

В данном случае Python использует порядок разрешения методов (MRO) для определения, какой метод вызывать. MRO определяет, в каком порядке Python ищет методы в иерархии наследования.

200

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

Сильная связь между обьектами(композитами): Жизненные циклы владельца и включенного объекта тесно связаны. Если владелец уничтожается, то и включенный объект также уничтожается.

200

Что такое магические методы и зачем они нужны?

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

200

Какие методы вы знаете для перегрузки арифметических операторов?

  1. Сложение (+):

    • __add__(self, other): Вызывается при использовании оператора +.
  2. Вычитание (-):

    • __sub__(self, other): Вызывается при использовании оператора -.
  3. Умножение (*):

    • __mul__(self, other): Вызывается при использовании оператора *.
  4. Деление (/):

    • __truediv__(self, other): Вызывается при использовании оператора /.
  5. Деление нацело (//):

    • __floordiv__(self, other): Вызывается при использовании оператора //.
  6. Остаток от деления (%):

    • __mod__(self, other): Вызывается при использовании оператора %.
  7. Возведение в степень (**):

    • __pow__(self, other, modulo=None): Вызывается при использовании оператора **.
  8. Отрицание (- унарный):

    • __neg__(self): Вызывается при использовании унарного оператора -.
  9. Абсолютное значение (abs()):

    • __abs__(self): Вызывается при использовании функции abs().
  10. Сравнение (<, <=, ==, !=, >=, >):

    • __lt__(self, other): Меньше.
    • __le__(self, other): Меньше или равно.
    • __eq__(self, other): Равно.
    • __ne__(self, other): Не равно.
    • __ge__(self, other): Больше или равно.
    • __gt__(self, other): Больше.
200

4) Что выводит следующий код?


class Parent():

def __init__(self):

print('Parent init')


def method(self):

print('Parent method')


class Child(Parent):

def __init__(self):

Parent.__init__(self)


def method(self):


super(Child, self).method()


child = Child()

child.method()

Parent method


300

Что выведет следующий код?

class A:

def hello(self):

print('hello world')


class B:

def hello(self):

print('HELLO WORLD')


class C(A, B):

pass

obj = C()

obj.hello()

hello world
300

1. Зачем нужен super()?

2. class Rectangle:

def __init__(self, length, width):

self.length = length

self.width = width


def area(self):

return self.length * self.width

def perimeter(self):

return 2 * self.length + 2 * self.width

# Here we declare that the Square class inherits from the Rectangle class

class Square(Rectangle):

def __init__(self, length):

super().__init__(length, length)

super() в Python - это встроенная функция, которая используется для вызова методов родительского класса. Она предоставляет доступ к методам и атрибутам родительского класса, что особенно полезно в контексте наследования и переопределения методов в подклассах.

2. результата корректный

300

Что такое конструктор и деструктор?

__new__

__del__

300

Что выполняет данная логика?

from os.path import join


class FileObject:


def __init__(self, filepath='~', filename='sample.txt'):

# открыть файл filename в filepath в режиме чтения и записи

self.file = open(join(filepath, filename), 'r+')


def __del__(self):

self.file.close()

del self.file

Данный код определяет класс FileObject, который представляет объект файла. В конструкторе (__init__) класса происходит открытие файла с использованием функции open из модуля os.path, и файл открывается в режиме чтения и записи ('r+'). Путь к файлу и его имя строятся с использованием функции join, где filepath является путем к директории, а filename - именем файла. Если при создании объекта не передаются значения для filepath и filename, то используются значения по умолчанию ('~' и 'sample.txt' соответственно).

Метод __del__ определен для закрытия файла при удалении объекта. В данном случае, метод __del__ закрывает файл, вызывая close(), и затем удаляет атрибут self.file с использованием del.

Важно отметить, что использование метода __del__ для закрытия файла не всегда является хорошей практикой, потому что не гарантируется, когда именно метод __del__ будет вызван (например, если сборщик мусора решит, что объект больше не нужен). Рекомендуется явно закрывать файл в явном порядке, например, с использованием конструкции with или явного вызова метода закрытия. 

300

5) Каким образом можно получить доступ к родительскому методу из дочернего класса?

Использование имени родительского класса:

Использование встроенной функции super():

400

Что такое миксины? Для чего они нужны?

МИКСИНЫ(КЛАССЫ ПРИМЕСИ) - КЛАССЫ КОТОРЫЕ ИСПОЛЬЗУЮТСЯ ДЛЯ НАСЛЕДОВАНИЯ. ОТ МИКСИНОВ ОБЬЕКТЫ НЕ СОЗДАЮТ. ИХ ЗАДАЧА РАСШИРЯТЬ ФУНКЦИОНАЛ КЛАССА(ДОБАВЛЯЕМ МЕТОДЫ И АТРИБУТЫ) И НЕ ПРЕДНАЗНАЧЕНЫ ДЛЯ СОЗДАНИЯ ОБЬЕКТОВ.

400

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

Для вызова метода унаследованного класса в Python используется ключевое слово super(). super() обеспечивает доступ к методам родительского класса, что позволяет вызвать метод из родительского класса в подклассе.

400

Что делает __new__, __init__, __del__?

1. Метод __new__ отвечает за создание нового экземпляра класса.

2. Метод __init__ отвечает за инициализацию созданного объекта.

3.  Метод __del__ отвечает за освобождение ресурсов и выполнение операций при уничтожении объекта.

400

1) Что такое Полиморфизм в ООП? Привидите примеры

ПОЛИМОРФИЗМ - МЕТОДЫ НАЗЫВАЮТСЯ ОДИНАКОВО НО РАБОТАЮТ ПО РАЗНОМУ. 

(РАЗНОЕ ПОВЕДЕНИЕ ОДНОГО И ТОГО ЖЕ МЕТОДА В РАЗНЫХ КЛАССАХ)


400

6) Какой вывод у следующего кода?


class English:

def greeting(self):

print ("Hello")


class French:

def greeting(self):

print ("Bonjour")


def intro(language):

language.greeting()


john = English()

gerard = French()

intro(john)

intro(gerard)

class English:

    def greeting(self):

        print("Hello")


class French:

    def greeting(self):

        print("Bonjour")


def intro(language):

    language.greeting()


# Создаем объекты классов English и French

john = English()

gerard = French()


# Вызываем функцию intro, передавая объект john (типа English)

intro(john)

# Выводит "Hello", так как метод greeting в классе English печатает "Hello"


# Вызываем функцию intro, передавая объект gerard (типа French)

intro(gerard)

# Выводит "Bonjour", так как метод greeting в классе French печатает "Bonjour"

Hello

Bonjour


500

Что выполняет следующий код?

class GraphicalEntity:

def __init__(self, pos_x, pos_y, size_x, size_y):

self.pos_x = pos_x

self.pos_y = pos_y


self.size_x = size_x

self.size_y = size_y

class Button(GraphicalEntity):

def __init__(self, pos_x, pos_y, size_x, size_y):

super().__init__(pos_x, pos_y, size_x, size_y)

self.status = False

def toggle(self):

self.status = not self.status


class LimitSizeMixin:

def __init__(self, pos_x, pos_y, size):

size_x = min(size_x, 500)

size_y = min(size_y, 400)

super().__init__(pos_x, pos_y, size_x, size_y)


class LimitSizeButton(Button, LimitSizeMixin):

pass

b = LimitSizeButton(10, 20, 200, 100)

&&&


500

От чего наследуется любой класс в питоне и что такое object?

В Python любой класс автоматически наследуется от встроенного базового класса object

object в Python — это встроенный базовый класс, который является корневым классом для всех остальных классов в языке.

500

Что такое __getattr__, __setattr__, __delattr__?

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

2. __setattr__  Вызывается при попытке установить значение атрибута.

3. __delattr__  Вызывается при попытке удалить атрибут с использованием оператора del.

500

2) Что выполняет следущий код? Какой у него вывод?


class Mammal:

def move(self):

print('Двигается')


class Hare(Mammal):

def move(self):

print('Прыгает')


animal = Mammal()

animal.move()

hare = Hare()

hare.move()

Двигается

Прыгает


500

7) Каким образом реализовать обязательное переопределение родительского метода в

дочерних классах?

можно использовать абстрактные методы с использованием модуля abc (Abstract Base Classes) для достижения подобного эффекта.

from abc import ABC, abstractmethod


class Shape(ABC):

    @abstractmethod

    def area(self):

        pass


class Circle(Shape):

    def __init__(self, radius):

        self.radius = radius


    def area(self):

        return 3.14 * self.radius ** 2


class Square(Shape):

    def __init__(self, side):

        self.side = side


    def area(self):

        return self.side ** 2


# Пример использования

circle = Circle(5)

square = Square(4)


print(circle.area())  # Выведет площадь круга

print(square.area())  # Выведет площадь квадрата