Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Билеты ВвИТ, СиСС, Экзамен 3 сем, 2021.docx
Скачиваний:
36
Добавлен:
21.01.2022
Размер:
41.28 Кб
Скачать

19. Функция super. Объяснить принцип ее работы.

Функция super() возвращает специальный объект, который делегирует («передаёт») вызовы методов от производного класса к базовому. Эту функцию можно вызывать в любом методе класса — в частности, в конструкторе.

Фактически фраза super().__init__(size, size) звучит так: вызови метод __init__ у моего базового (родительского) класса.

20. Что такое “магические методы” в python? Их отличительная особенность в именовании. Какие задачи выполняют? Назвать пять штук с объяснением их работы.

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

Примеры таких методов:

Метод

Описание работы

__init__(self, other)

Инициализация объектов класса

__add__(self, other)

Сложение (x + y)

__sub__(self, other)

Вычитание (x - y)

__mul__(self, other)

Умножение (x * y)

__truediv__(self, other)

Деление (x / y)

__len__(self)

Возвращение длины объекта

__repr__(self)

Полная информация об объекте

21. Как работают getattr, setattr, hasattr и т.Д.? Как переопределить их стандартную реализацию для конкретного класса?

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

Этот метод не вызывается, если интерпретатор может обнаружить атрибут посредством выполнения процедуры поиска в дереве наследования. Вследствие этого метод __getattr__ удобно использовать для обобщенной обработки запросов к атрибутам. Например:

class A:

def __getattr__(self, attrname):

if attrname == "age":

return 20

else:

raise AttributeError

x = A()

print(x.age)

print(x.name)

20

Traceback (most recent call last):

AttributeError

В этом примере класс A и его экземпляр x не имеют своих собственных атрибутов, поэтому при обращении к атрибуту X.age вызывается метод __getattr__ — в аргументе self передается экземпляр(X), а в аргументе attrname — строка с именем неопределенного атрибута («age»).

Родственник метода __getattr__ является метод перезагрузки __setattr__ который перехватывает все попытки присваивания значений атрибутам.

class A:

def __setattr__(self, key, value):

if key =='age':

self.__dict__[key] = value

else:

raise AttributeError

x = A()

x.age = 40

print(x.age)

x.name = 'Bob'

40

Traceback (most recent call last):

AttributeError

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

Функция hasattr проверяет существование атрибута с именем в объекте. Возвращает True, если атрибут с именем существует, иначе False.

Пример:

class MyObj:

name = 'Chuck Norris'

phone = '+666111000'

country = 'Norway'

# Проверим наличие атрибутов в объекте MyObj:

x = hasattr(MyObj, 'phone')

y = hasattr(MyObj, 'age')

print(x, y)

True, False