"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué deberías usar más atributos?

¿Por qué deberías usar más atributos?

Publicado el 2024-11-07
Navegar:763

Why should you use attrs more

Introducción

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:

  • Reduce el código repetitivo
  • Mejora la legibilidad y el mantenimiento del código
  • Proporciona potentes funciones para la validación y conversión de datos
  • Mejora el rendimiento mediante implementaciones optimizadas

2. Comenzando con 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)

3. Características principales de los atributos

a. Generación automática de métodos:

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

b. Definición de atributos con tipos y valores predeterminados:

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)

do. Validadores y conversores:

import attr

def must_be_positive(instance, attribute, value):
    if value 



4. 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 attribute

do. 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:

  • Utilice anotaciones de tipo para mejorar la legibilidad del código y la compatibilidad con IDE
  • Aprovechar los validadores para la integridad de los datos
  • Usar clases congeladas para objetos inmutables
  • Aproveche la generación automática de métodos para reducir la duplicación de código

Errores comunes:

  • Olvidar usar el decorador @attr.s en la clase
  • Uso excesivo de validadores complejos que podrían ser métodos separados
  • Sin considerar el impacto en el rendimiento del uso extensivo de funciones de fábrica

6. atributos frente a otras bibliotecas

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.

Comparación con clases de datos:

  • attrs tiene más funciones y es más flexible
  • las clases de datos están integradas en Python 3.7, lo que las hace más accesibles
  • attrs tiene mejor rendimiento en la mayoría de los casos
  • las clases de datos están vinculadas a la versión de Python, mientras que los atributos como biblioteca externa se pueden usar con cualquier versión de Python.

Comparación con Pydantic:

  • pydantic se centra en la validación de datos y la gestión de configuraciones
  • attrs tiene un propósito más general y se integra mejor con las bases de código existentes
  • pydantic tiene serialización JSON incorporada, mientras que attrs requiere bibliotecas adicionales

Cuándo elegir atributos:

  • Para jerarquías de clases complejas con comportamientos personalizados
  • Cuando necesitas un control detallado sobre las definiciones de atributos
  • Para proyectos que requieren compatibilidad con Python 2 (aunque ahora menos relevante)

7. Rendimiento y aplicaciones del mundo real

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)

8. Conclusión y llamado a la acción

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:

  • Repositorio de GitHub: https://github.com/python-attrs/attrs
  • Documentación: https://www.attrs.org/
  • Página de PyPI: https://pypi.org/project/attrs/

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!


  1. https://stefan.sofa-rockers.org/2020/05/29/attrs-dataclasses-pydantic/ ↩

Declaración de liberación Este artículo se reproduce en: https://dev.to/soumendrak/why-should-you-use-attrs-more-4dim?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

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