La biblioteca attrs de Python cambia las reglas del juego para los desarrolladores que buscan simplificar la creación de clases y reducir el código repetitivo. Incluso la NASA confía en esta biblioteca.
Creado por Hynek Schlawack en 2015, attrs se ha convertido rápidamente en una herramienta favorita entre los desarrolladores de Python por su capacidad para generar automáticamente métodos especiales y proporcionar una forma limpia y declarativa de definir clases.
clases de datos es una especie de subconjunto de atributos.
Por qué son útiles los atributos:
Instalación:
Para comenzar con atributos, puedes instalarlo usando pip:
pip install attrs
Uso básico:
Aquí hay un ejemplo simple de cómo usar atributos para definir una clase:
import attr @attr.s class Person: name = attr.ib() age = attr.ib() # Creating an instance person = Person("Alice", 30) print(person) # Person(name='Alice', age=30)
attrs genera automáticamente los métodos init, repr y eq para tus clases:
@attr.s class Book: title = attr.ib() author = attr.ib() year = attr.ib() book1 = Book("1984", "George Orwell", 1949) book2 = Book("1984", "George Orwell", 1949) print(book1) # Book(title='1984', author='George Orwell', year=1949) print(book1 == book2) # True
import attr from typing import List @attr.s class Library: name = attr.ib(type=str) books = attr.ib(type=List[str], default=attr.Factory(list)) capacity = attr.ib(type=int, default=1000) library = Library("City Library") print(library) # Library(name='City Library', books=[], capacity=1000)
import attr def must_be_positive(instance, attribute, value): if value4. Uso avanzado
a. Personalización del comportamiento de los atributos:
import attr @attr.s class User: username = attr.ib() _password = attr.ib(repr=False) # Exclude from repr @property def password(self): return self._password @password.setter def password(self, value): self._password = hash(value) # Simple hashing for demonstration user = User("alice", "secret123") print(user) # User(username='alice')b. Instancias y espacios congelados:
@attr.s(frozen=True) # slots=True is the default class Point: x = attr.ib() y = attr.ib() point = Point(1, 2) try: point.x = 3 # This will raise an AttributeError except AttributeError as e: print(e) # can't set attributedo. Funciones de fábrica y procesamiento posterior al inicio:
import attr import uuid @attr.s class Order: id = attr.ib(factory=uuid.uuid4) items = attr.ib(factory=list) total = attr.ib(init=False) def __attrs_post_init__(self): self.total = sum(item.price for item in self.items) @attr.s class Item: name = attr.ib() price = attr.ib(type=float) order = Order(items=[Item("Book", 10.99), Item("Pen", 1.99)]) print(order) # Order(id=UUID('...'), items=[Item(name='Book', price=10.99), Item(name='Pen', price=1.99)], total=12.98)5. Mejores prácticas y errores comunes
Mejores prácticas:
Biblioteca | Características | Actuación | Comunidad |
---|---|---|---|
atributos | Generación automática de métodos, definición de atributos con tipos y valores predeterminados, validadores y conversores | Mejor rendimiento que el código manual | Comunidad activa |
pydantico | Validación de datos y gestión de configuraciones, generación automática de métodos, definición de atributos con tipos y valores predeterminados, validadores y conversores | Buen desempeño | Comunidad activa |
clases de datos | Integrado en Python 3.7, haciéndolos más accesibles | Vinculado a la versión Python | Biblioteca Python incorporada |
los atributos y clases de datos son más rápidos que pydantic1.
Actuación:
attrs generalmente ofrece un mejor rendimiento que las clases escritas manualmente u otras bibliotecas debido a sus implementaciones optimizadas.
Ejemplo del mundo real:
from attr import define, Factory from typing import List, Optional @define class Customer: id: int name: str email: str orders: List['Order'] = Factory(list) @define class Order: id: int customer_id: int total: float items: List['OrderItem'] = Factory(list) @define class OrderItem: id: int order_id: int product_id: int quantity: int price: float @define class Product: id: int name: str price: float description: Optional[str] = None # Usage customer = Customer(1, "Alice", "[email protected]") product = Product(1, "Book", 29.99, "A great book") order_item = OrderItem(1, 1, 1, 2, product.price) order = Order(1, customer.id, 59.98, [order_item]) customer.orders.append(order) print(customer)
attrs es una potente biblioteca que simplifica las definiciones de clases de Python y al mismo tiempo proporciona funciones sólidas para la validación y manipulación de datos. Su capacidad para reducir el código repetitivo, mejorar la legibilidad y mejorar el rendimiento lo convierte en una herramienta invaluable para los desarrolladores de Python.
Recursos comunitarios:
Prueba attrs en tu próximo proyecto y experimenta sus beneficios de primera mano. Comparte tus experiencias con la comunidad y contribuye a su desarrollo continuo. ¡Feliz codificación!
https://stefan.sofa-rockers.org/2020/05/29/attrs-dataclasses-pydantic/ ↩
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3