фото Эмиль Перрон на Неспособный
Используя getattr
Прежде чем мы запрыгнем в то, как Getattr может быть полезным инструментом для сушки нашего кода, давайте рассмотрим, как он работает (документы здесь )! Короче говоря, он требует объекта и строковой версии имени свойства и возвращает значение этого свойства, если он существует на объекте. При желании можно вернуть значение по умолчанию, если атрибут не может быть найден в объекте, и в противном случае вернет атрибут.
Хорошо, давайте посмотрим на пример, используя класс с голой. Учитывая класс человека, как определено ниже:
class Person(object): def __init__(self, first_name, last_name): self.first_name = first_name self.last_name = last_name def say_hello(name): print "Hello, {}!".format(name)
Хорошо, давайте получим экземпляр человека:
adrienne = Person("Adrienne", "Domingus")
Как только я был создан, мы можем получить доступ к моему Имя
( и last_name
) атрибут с использованием более знакомой точечной нотации, но мы можем также Получите это с помощью getattr
, с тем же результатом:
>>> adrienne.first_name 'Adrienne' >>> getattr(adrienne, 'first_name') 'Adrienne'
Это имеет смысл, потому что атрибуты _name являются… атрибутами. Но теперь для забавной части: знаете ли вы, что методы класса также являются атрибутами? Например:
>>> getattr(adrienne, 'say_hello')>
Теперь это не очень интересно, это не на самом деле сделать что-либо. Но сила в этом заключается в том, что мы можем сохранить это возвращаемое значение в переменной, а затем назвать его. Вот так:
>>> method = getattr(adrienne, 'say_hello') >>> method("Someone else") Hello, Someone else!
Расположение на работу: обобщение вызовов методов
Хорошо, так здорово, что вы можете использовать getattr
Чтобы получить методы, а также свойства, но как это нам помогает? Что ж, это определенно может быть полезно при сохранении вашего кода сухой, если у вас есть какая -то общая логика, окружающая вызовы метода ветвления.
Например, если нам нужно сделать вызов API, но какой метод мы используем, зависит от контекста, вместо того, чтобы делать это:
if http_method == 'post': requests.post(url, data=data) elif http_method == 'put': requests.put(url, data=data)
Мы можем сделать это:
method = getattr(requests, http_method) method(url, data=data)
Разница может показаться немного тривиальной в этом примере, но с объектами, которые имеют значительно больше параметров метода, чем в этом примере, начальный метод, полагаясь на операторы IF и ELIF, особенно плохо. getattr
на помощь!
Оригинал: “https://dev.to/adriennedomingus/python-using-getattr-for-properties-and-methods-13ca”