Функция hasattr() в Python и практические примеры

Функция  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() добавляет запись в словарь ошибок.

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *