Python の attrs ライブラリは、クラスの作成を簡素化し、定型コードを削減したいと考えている開発者にとって状況を大きく変えるものです。このライブラリは NASA からも信頼されています。
2015 年に Hynek Schlawack によって作成された attrs は、特別なメソッドを自動的に生成し、クラスを定義するクリーンで宣言的な方法を提供する機能により、すぐに Python 開発者の間で人気のツールになりました。
dataclasses は attrs.
attrs が役立つ理由:
インストール:
attrs を使い始めるには、pip:
を使用してインストールできます。
pip install attrs
基本的な使い方:
以下は、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)
attrs は、クラスの init、repr、および eq メソッドを自動的に生成します。
@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. 高度な使い方
a.属性の動作をカスタマイズする:
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.凍結されたインスタンスとスロット:
@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 attributec.ファクトリー関数と初期化後の処理:
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. ベストプラクティスとよくある落とし穴
ベストプラクティス:
図書館 | 特徴 | パフォーマンス | コミュニティ |
---|---|---|---|
属性 | 自動メソッド生成、タイプとデフォルト値による属性定義、バリデーターとコンバーター | 手動コードよりも優れたパフォーマンス | アクティブなコミュニティ |
ピダンティック | データ検証と設定管理、自動メソッド生成、タイプとデフォルト値による属性定義、バリデーターとコンバーター | 良いパフォーマンス | アクティブなコミュニティ |
データクラス | Python 3.7 に組み込まれ、アクセスしやすくなりました | Python バージョンに関連付けられています | 組み込み Python ライブラリ |
属性とデータクラスは pydantic1.
より高速です。パフォーマンス:
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)
attrs は、データの検証と操作のための堅牢な機能を提供しながら、Python クラス定義を簡素化する強力なライブラリです。ボイラープレート コードを削減し、可読性を向上させ、パフォーマンスを向上させる機能により、Python 開発者にとって非常に貴重なツールとなっています。
コミュニティ リソース:
次のプロジェクトで attrs を試して、そのメリットを直接体験してください。あなたの経験をコミュニティと共有し、コミュニティの継続的な発展に貢献してください。コーディングを楽しんでください!
https://stefan.sofa-rockers.org/2020/05/29/attrs-dataclasses-pydantic/ ↩
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3