Fork me on GitHub

Attr - полезная практика ООП в Python

источник: https://nuancesprog.ru/p/8572/

Установка библиотеки

pip install attrs

Использование

без использования библиотек

class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

p1 = Person('Chris', 32)
p2 = Person('Chris', 32)

где p1 == p2 // False
from attr import attrs, attrib

@attrs
class Person(object):
    name = attrib()
    age = attrib()

p1 = Person('Chris', 32)
p2 = Person('Chris', 32)

где p1 == p2 // True

Атрибуты без инициализации

@attrs
class Person(object):
    name = attrib()
    age = attrib()
    skills = attrib(init=False) // этот атрибут инициализируем позднее

p1 = Person('Chris', 32)

Значения по умолчанию

@attrs
class Person(object):
    name = attrib(default='Chris')
    age = attrib(default=32)

p1 = Person()
p2 = Person('Chris', 32)

если мы хотим установить атрибут с пустой коллекцией в качестве значения по умолчанию? Обычно мы не хотим передавать [] в качестве аргумента. для этого нужно использовать "фабричный метод" из attr

@attrs
class Person(object):
    name = attrib(default='Chris')
    age = attrib(default=32)
    skills = attrib(factory=list)

Проверка атрибутов

@attrs
class Student(object):
    name = attrib()
    age = attrib()
    student_id = attrib()

    @student_id.validator
    def check_student_id(self, attribute, value):
        if len(str(value)) != 6:
            raise ValueError(f'student_id must be 6 characters! got {len(str(value))}')

Обратите внимание, что для этого нам нужно определить функцию. Она должна быть аннотирована как @.validator

Подклассы

@attrs
class Person(object):
    name = attrib()
    age = attrib()

    def get_name(self):
        return self.name

@attrs
class User(object):
    user_id = attrib()

    def get_user_id(self):
        return self.user_id

@attrs
class Student(Person, User):
    student_id = attrib()

    def get_student_id(self):
        return self.student_id



student = Student(name='Chris', age=32, user_id='ctao', student_id=123456)

Student наследует как от Person, так и от User

Сериализация в словарь

attr.asdict(student)

легко сериализовать экземпляры в словари, которые затем можно использовать в JSON

social