"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 속성을 더 많이 사용해야 하는 이유

속성을 더 많이 사용해야 하는 이유

2024-11-07에 게시됨
검색:118

Why should you use attrs more

소개

Python의 속성 라이브러리는 클래스 생성을 단순화하고 상용구 코드를 줄이려는 개발자를 위한 게임 체인저입니다. 이 라이브러리는 NASA에서도 신뢰를 받고 있습니다.
2015년 Hynek Schlawack이 만든 attrs는 특수 메서드를 자동으로 생성하고 클래스를 정의하는 깔끔하고 선언적인 방법을 제공하는 기능으로 인해 Python 개발자들 사이에서 빠르게 선호되는 도구가 되었습니다.
데이터 클래스는 일종의 속성 하위 집합입니다.

속성이 유용한 이유:

  • 상용구 코드 감소
  • 코드 가독성 및 유지 관리 용이성 향상
  • 데이터 검증 및 변환을 위한 강력한 기능 제공
  • 최적화된 구현을 통해 성능 향상

2. 속성 시작하기

설치:
attrs를 시작하려면 pip:
를 사용하여 설치할 수 있습니다.

pip install attrs

기본 사용법:
다음은 속성을 사용하여 클래스를 정의하는 방법에 대한 간단한 예입니다.

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. attrs의 핵심 기능

에이. 자동 분석법 생성:

attrs는 클래스에 대한 init, repreq 메소드를 자동으로 생성합니다.

@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 value 



4. 고급 사용법

에이. 속성 동작 사용자 정의:

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')

비. 고정된 인스턴스 및 슬롯:

@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

기음. 팩토리 기능 및 초기화 후 처리:

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. 모범 사례 및 일반적인 함정

모범 사례:

  • 더 나은 코드 가독성과 IDE 지원을 위해 유형 주석을 사용하세요.
  • 데이터 무결성을 위한 유효성 검사기 활용
  • 불변 객체에 고정 클래스 사용
  • 자동 메소드 생성을 활용하여 코드 중복 감소

일반적인 함정:

  • 클래스에서 @attr.s 데코레이터를 사용하는 것을 잊어버렸습니다.
  • 별도의 메서드가 될 수 있는 복잡한 유효성 검사기를 과도하게 사용
  • 공장 기능의 광범위한 사용이 성능에 미치는 영향을 고려하지 않음

6. 속성과 다른 라이브러리

도서관 특징 성능 지역 사회
속성 자동 메소드 생성, 유형 및 기본값이 포함된 속성 정의, 유효성 검사기 및 변환기 수동 코드보다 더 나은 성능 활성 커뮤니티
농담 데이터 검증 및 설정 관리, 자동 메소드 생성, 유형 및 기본값을 사용한 속성 정의, 검증기 및 변환기 좋은 성과 활성 커뮤니티
데이터 클래스 Python 3.7에 내장되어 더 쉽게 접근할 수 있습니다. Python 버전과 연결됨 내장 Python 라이브러리

attrs 및 데이터 클래스는 pydantic1.

보다 빠릅니다.

데이터 클래스와의 비교:

  • attrs는 기능이 더 풍부하고 유연합니다.
  • 데이터 클래스는 Python 3.7에 내장되어 있어 더 쉽게 액세스할 수 있습니다.
  • attrs는 대부분의 경우 더 나은 성능을 발휘합니다.
  • 데이터 클래스는 Python 버전에 연결되어 있는 반면, 외부 라이브러리인 속성은 모든 Python 버전에서 사용할 수 있습니다.

피단틱과의 비교:

  • pydantic은 데이터 검증 및 설정 관리에 중점을 두고 있습니다.
  • attrs는 보다 범용적이며 기존 코드베이스와 더 잘 통합됩니다.
  • pydantic에는 JSON 직렬화가 내장되어 있지만 attrs에는 추가 라이브러리가 필요합니다.

속성을 선택하는 경우:

  • 맞춤 동작이 포함된 복잡한 클래스 계층 구조용
  • 속성 정의를 세밀하게 제어해야 하는 경우
  • Python 2 호환성이 필요한 프로젝트의 경우(지금은 관련성이 낮지만)

7. 성능 및 실제 응용

성능:
attrs는 일반적으로 최적화된 구현으로 인해 수동으로 작성된 클래스나 다른 라이브러리보다 더 나은 성능을 제공합니다.

실제 사례:

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. 결론 및 행동 촉구

attrs는 Python 클래스 정의를 단순화하는 동시에 데이터 검증 및 조작을 위한 강력한 기능을 제공하는 강력한 라이브러리입니다. 상용구 코드를 줄이고, 가독성을 높이고, 성능을 향상시키는 기능은 Python 개발자에게 귀중한 도구입니다.

커뮤니티 리소스:

  • GitHub 저장소: https://github.com/python-attrs/attrs
  • 문서: https://www.attrs.org/
  • PyPI 페이지: https://pypi.org/project/attrs/

다음 프로젝트에서 속성을 사용해 보고 그 이점을 직접 경험해 보세요. 귀하의 경험을 커뮤니티와 공유하고 지속적인 발전에 기여하십시오. 즐거운 코딩하세요!


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

릴리스 선언문 이 글은 https://dev.to/soumendrak/why-should-you-use-attrs-more-4dim?1 에서 복제됩니다.1 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3