Шаг 140.
Основы языка Python.
Объектно-ориентированное программирование (ООП). Специальные методы
На этом шаге мы рассмотрим еще ряд методов, которые поддерживаются классами.
Классы поддерживают следующие специальные методы:
- __call__() - позволяет обработать вызов экземпляра класса как вызов функции. Формат метода:
__call__ (self [, <Параметр1>[, ..., <ПараметрN>]])
Пример:
class MyClass:
def __init__(self, m):
self.msg = m
def __call__(self):
print(self.msg)
c1 = MyClass("Значение1") # Создание экземпляра класса
c2 = MyClass("Значение2") # Создание экземпляра класса
c1() # Выведет: Значение1
c2() # Выведет: Значение2
Архив с файлом можно взять здесь.
Результат работы приложения:
- __getattr__(self, <Атрибут>) - вызывается при обращении к несуществующему атрибуту класса. Пример:
class MyClass:
def __init__(self):
self.i = 20
def __getattr__(self, attr):
print("Вызван метод __getattr__()")
return 0
c = MyClass()
# Атрибут i существует
print (c.i) # Выведет: 20. Метод __getattr__()
# Атрибут s не существует
print(c.s) # Выведет: Вызван метод __getattr__()
Архив с файлом можно взять здесь.
Результат работы приложения:
20
Вызван метод __getattr__()
0
- __getattribute__ (self, <Атрибут>) - вызывается при обращении к любому атрибуту класса. Необходимо учитывать, что использование точечной нотации (для обращения к атрибуту класса) внутри этого метода
приведет к зацикливанию. Чтобы избежать зацикливания, следует вызывать метод __getattribute__() объекта object. Внутри метода нужно вернуть значение атрибута или возбудить исключение AttributeError. Пример:
class MyClass:
def __init__(self):
self.i = 20
def __getattribute__(self, attr):
print("Вызван метод __getattribute__()")
return object.__getattribute__(self, attr) # Только так!!!
c = MyClass()
print (c.i) # Выведет: Вызван метод __getattribute__() 20
Архив с файлом можно взять здесь.
Результат работы приложения:
Вызван метод __getattribute__()
20
- __setattr__(self, <Атрибут>, <Значение>) - вызывается при попытке присваивания значения атрибуту экземпляра класса. Если внутри метода необходимо присвоить значение атрибуту, то
следует использовать словарь __dict__, иначе при точечной нотации метод __setattr__() будет вызван повторно, что приведет к зацикливанию. Пример:
class MyClass:
def __setattr__(self, attr, value):
print("Вызван метод __setattr__()")
self.__dict__[attr] = value
c = MyClass()
c.i = 10 # Выведет: Вызван метод __setattr__()
print (c.i) # Выведет: 10
Архив с файлом можно взять здесь.
Результат работы приложения:
Вызван метод __setattr__()
10
- __delattr__(self, <Атрибут>) - вызывается при удалении атрибута с помощью инструкции del <Экземпляр класса>.<Атрибут>;
- __len__(self) - вызывается при использовании функции len(), а также для проверки объекта на логическое значение при отсутствии метода __bool__(). Метод должен возвращать положительное целое число. Пример:
class MyClass:
def __len__(self):
return 50
c = MyClass()
print (len(c)) # Выведет: 50
Архив с файлом можно взять здесь.
Результат работы приложения:
- __bool__(self) - вызывается при использовании функции bool();
- __int__(self) - вызывается при преобразовании объекта в целое число с помощью функции int();
- __float__(self) - вызывается при преобразовании объекта в вещественное число с помощью функции float();
- __complex__(self) - вызывается при преобразовании объекта в комплексное число с помощью функции complex();
- __round__(self, n) - вызывается при использовании функции round();
- __index__(self) - вызывается при использовании функций bin(), hex() и oct();
- __repr__(self) и __str__(self) - служат для преобразования объекта в строку. Метод __repr__() вызывается при выводе в интерактивной оболочке, а также при использовании функции repr().
Метод __str__() вызывается при выводе с помощью функции print(), а также при использовании функции str(). Если метод __str__() отсутствует, то будет вызван метод __repr__().
В качестве значения методы __repr__() и __str__() должны возвращать строку. Пример:
class MyClass:
def __init__(self, m):
self.msg = m
def __repr__(self):
return "Вызван метод __repr__() {0}".format(self.msg)
def __str__(self):
return "Вызван метод __str__() {0}".format(self.msg)
c = MyClass("Значение")
print(repr(c)) # Выведет: Вызван метод __repr__() Значение
print(str(c)) # Выведет: Вызван метод __str__() Значение
print(c) # Выведет: Вызван метод __str__() Значение
Архив с файлом можно взять здесь.
Результат работы приложения:
Вызван метод __repr__() Значение
Вызван метод __str__() Значение
Вызван метод __str__() Значение
- __hash__(self) - этот метод следует переопределить, если экземпляр класса планируется использовать в качестве ключа словаря или внутри множества. Пример:
class MyClass:
def __init__(self, y):
self.x = y
def __hash__(self):
return hash (self.x)
c = MyClass(10)
d = {}
d[c] = "Значение"
print(d[c]) # Выведет: Значение
Архив с файлом можно взять здесь.
Результат работы приложения:
Классы поддерживают еще несколько специальных методов, которые применяются лишь в особых случаях и будут рассмотрены позднее.
На следующем шаге мы рассмотрим перегрузку операторов.
Предыдущий шаг
Содержание
Следующий шаг