источник: 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))}')
Обратите внимание, что для этого нам нужно определить функцию. Она должна быть аннотирована как @
Подклассы
@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