Функция hasattr() используется в Python для проверки наличия у объекта именованного атрибута.
Что такое функция hasattr() в Python?
Функция hasattr() возвращает True, если объект имеет именованный атрибут, заданный строкой:
hasattr(object, name)
Функция hasattr() имеет два параметра:
- object — объект, который вы хотите проверить.
- name — это строка, определяющая имя атрибута.
Hasattr() возвращает True, если объект имеет атрибут с именем, указанным в строке name, или False в противном случае.
Пример функции hasattr() в Python
Следующий пример иллюстрирует использование функции hasattr():
class Message:
error="error"
warning = 'warning'
info = 'info'
success="success"
result = hasattr(Message, 'error')
print(result) # 👉 True
result = hasattr(Message, 'information')
print(result) # 👉 False
Обратите внимание, что в Python все является объектом, включая класс. Поэтому вы можете передать класс в функцию hasattr().
Как это работает.
- Сначала определите класс Message с четырьмя атрибутами класса:
class Message:
error="error"
warning = 'warning'
info = 'info'
success="success"
- Во-вторых, используйте hasattr(), чтобы проверить, имеет ли класс Message атрибут error:
result = hasattr(Message, 'error') print(result) # 👉 True
В этом случае возвращается значение True, поскольку класс Message имеет атрибут error.
- В-третьих, используйте hasattr(), чтобы проверить, имеет ли Message атрибут information:
result = hasattr(Message, 'information') print(result) # 👉 False
В этом примере hasattr() возвращает False, поскольку класс Message не имеет атрибута information.
Практический пример метода hasattr() в Python
На практике вы используете функцию hasattr(), чтобы проверить, есть ли у объекта атрибут или метод с именем, известным только во время выполнения, перед доступом к нему. Например, вы можете использовать hasattr(), чтобы проверить, есть ли у объекта метод, перед его вызовом.
Следующий пример расширяет класс Validation из руководства getattr():
import re
class Validation:
ERRORS = {
'required': 'The {} is required',
'email': 'The {} is not a valid email address'
}
def _required(self, value):
return len(value) > 0
def _email(self, value):
pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
return re.fullmatch(pattern, value)
def validate(self, data, rules):
errors = {}
for field, rule in rules.items():
if hasattr(self, f'_{rule}'):
is_valid_method = getattr(self, f'_{rule}')
if not is_valid_method(data[field]):
errors[field] = self.ERRORS[rule].format(field)
else:
errors[field] = f'The rule {rule} is not supported'
return errors
if __name__ == '__main__':
validation = Validation()
data = {'name': 'Jane Doe', 'email': '[email protected]'}
rules = {'name': 'required', 'email': 'email'}
errors = validation.validate(data, rules)
print(errors)
В этом примере hasattr() проверяет, есть ли у класса Validation метод с именем, соответствующим правилу, перед его вызовом. Если метод не существует, метод validate() добавляет запись в словарь ошибок.
