Функция getattr
в Python: назначение, пример использования
Встроенная функция getattr
языка программирования Python позволяет получать значение атрибута объекта, когда этот атрибут "упакован" в строку и применять его к объекту в нотации через точку невозможно. Пусть имеется такой класс:
class Square:
def __init__(self, width, height, units):
self.a = width
self.b = height
self.units = units
def area(self):
return self.a * self.b
def perimeter(self):
return self.a * 2 + self.b * 2
def __str__(self):
return f'{__class__.__name__}: ' \
f'{self.a} x {self.b} ({self.units})'
Вызов метода при условии, что мы не знаем, какой из них потребуется, может выглядеть так:
from square import Square
figure = Square(8.5, 14.1, 'cm')
print(figure) # Square: 8.5 x 14.1 (cm)
q = input('Аrea or perimeter: ').lower()
if q == 'area':
print(figure.area()) # 119.85
elif q == 'perimeter':
print(figure.perimeter()) # 45.2
С функцией getattr
задача решается проще:
from square import Square
figure = Square(8.5, 14.1, 'cm')
print(figure)
q = input('Аrea or perimeter: ').lower()
print(getattr(figure, q, lambda: "Error")())
Третий аргумент getattr
не обязательный. В простом случае функция вызывается как getattr(объект, атрибут_в_виде_строки)
. Однако, если указанного атрибута у объекта не окажется, произойдет выброс исключения AttributeError
. Если требуется избежать подобного, с помощью третьего аргумента подставляется значение по умолчанию. Это не значит, что у объекта появляется новый атрибут. Это значит, что функция getattr
просто вернет какое-то значение.
В примере выше обратите внимание на скобки после вызова getattr
. Функция getattr
возвращает значение атрибута. Если мы напишем getattr(figure, 'a')
, то получим 8.5. Но в случае атрибутов-методов это работает не так: мы получаем объект-метод, а не результат его вызова. Для вызова необходимы скобки и, если требуется, передача в них аргументов:
from square import Square
figure = Square(8.5, 14.1, 'cm')
side1 = getattr(figure, 'a')
print(side1) # 8.5
side2 = getattr(figure, 'b', 0)
print(side2) # 14.1
side3 = getattr(figure, 'c', 0)
print(side3) # 0
P = getattr(figure, 'perimeter')
print(P)
# <bound method Square.perimeter of <square.Square object at 0x7ff287e63fd0>>
print(figure.perimeter)
# <bound method Square.perimeter of <square.Square object at 0x7ff287e63fd0>>
print(P()) # 45.2
print(figure.perimeter()) # 45.2
Также с помощью getattr
можно проверять наличие определенного атрибута у объекта.
m = input('Метод списка: ')
try:
get_m = getattr(list, m)
help(get_m)
except AttributeError:
print("Нет такого метода")