工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Python

Python Attrs:高度なデータ クラスとサンプル コード

パッケージ Python Attrs を使用すると、単純な注釈を使用して高度なデータ クラスを作成できます。もちろん、python にも独自のネイティブ データ クラス モジュールがありますが、Python attrs パッケージには、お好みの追加機能がいくつか用意されています!

目次

属性をインストール

attrs パッケージはベース ライブラリの一部ではないため、pip install コマンドまたは Pipenv などの同様のものを使用してインストールする必要があります。他のプロジェクトに干渉しないように、仮想環境も作成する必要があるでしょう。このパッケージは attrs という名前なので、インストールは次のようになります:

$ pip install attrs

# or with pipenv:
$ pipenv install attrs

属性とデータ クラス

attrs の作者 実際、Python にデータ クラスを導入した PEP に取り組んでいます。 Python のネイティブ データ クラスは意図的に単純化され、理解しやすくなっていますが、属性は必要な機能をすべて提供しています!

Python attrs を選択するいくつかの理由 組み込みのデータ クラスは次のとおりです。

基本的な Python 属性の例

最初に非常に基本的な例を見てみましょう:

import attr

@attr.s
class Person(object):
    name = attr.ib(default='John')
    surname = attr.ib(default='Doe')
    age = attr.ib(init=False)
    
p = Person()
print(p)
p = Person('Bill', 'Gates')
p.age = 60
print(p)

# Output: 
#   Person(name='John', surname='Doe', age=NOTHING)
#   Person(name='Bill', surname='Gates', age=60)

いくつかの観察:

次に、通常のデータ クラスよりもこのパッケージが提供する最も重要な機能であるバリデーターとコンバーターを見てみましょう。

Python 属性バリデーターの例

次の 2 つの方法で、属性データ クラスにバリデータを追加できます。

<オール>
  • デコレータの使用
  • 呼び出し可能な関数を提供する
  • ここではまず、呼び出し可能な関数メソッドを示します。 Attrs はすぐに使用できるいくつかのバリデーターを提供します。そのうちの instance_of を使用します 次の例のバリデータ:

    >>> @attr.s
    ... class C(object):
    ...     x = attr.ib(validator=attr.validators.instance_of(int))
    >>> C(42)
    C(x=42)
    >>> C("a string")
    
    Traceback (most recent call last):
       ...
    TypeError: ("'x' must be <type 'int'> (got 'a string' that is a <type 'str'>).", ...

    x の文字列値でオブジェクト C を作成しようとしたため、文字列ではなく int 型が必要なため、instance_of バリデーターはエラーをスローします。

    独自のバリデータを定義しましょう:

    import attr
    
    @attr.s
    class DividableByTwo(object):
        x = attr.ib()
    
        @x.validator
        def check(self, attribute, value):
            if value % 2 != 0:
                raise ValueError(f'{value} is not dividable by 2')
    
    print (DividableByTwo(60))
    print (DividableByTwo(11))
    
    # Output will be something like:
    # DividableByTwo(x=60)
    # ...
    # ValueError: 11 is not dividable by 2

    Python 属性コンバーターの例

    コンバーターは、設定された値を取得して自動的に変換します。これはあらゆる種類の目的に使用できます。 1 つの例は、値を int に自動的に変換することです。繰り返しますが、呼び出し可能な関数の使用から始めましょう。この場合、単純に Python の int() 関数を使用します:

    import attr
    
    @attr.s
    class C(object):
        x = attr.ib(converter=int)
    
    c = C("1")
    print(c)
    # Output:
    # C(x=1)

    入力 (文字列「1」) は自動的に整数に変換されました。コンバーターはバリデーターの前に実行されるため、変換後に最終的な値を検証できます。たとえば、上記の 2 つの例では、最初に入力を int に変換してから、値が 2 で割り切れるかどうかを確認できます。

    Python 属性でスロットを使用する

    最後に、attrs にスロット クラスを使用するように指示できます。スロットクラスには、通常のクラスよりもいくつかの利点があります:

    要するに、スロット化されたクラスを使用して、オブジェクト インスタンスが持つと予想されるインスタンス属性を明示的に指定します。このようにして、Python はいくつかのチェックなどを省略できるため、メモリ使用量が少なくなり、速度がわずかに向上します。詳細については、こちらの attrs ドキュメントを参照してください。

    ただし、スロット化されたクラスには、特に手動で作成する場合に注意が必要です。幸いなことに、attrs はこの機能を有効にする簡単な方法を提供してくれます:

    import attr
    
    @attr.s(slots=True)
    class YourClassName:
        ...

    学び続ける


    Python

    1. Python データ型
    2. 例を使用した Python 文字列 strip() 関数
    3. 例を使用した Python 文字列 count()
    4. 例を使用した Python round() 関数
    5. 例を使用した Python map() 関数
    6. Python Timeit() と例
    7. 例を使用したコレクション内の Python カウンター
    8. Python time.sleep():コードに遅延を追加する (例)
    9. 例を使用した Python List count()
    10. Python List index() と例
    11. Python - C による拡張プログラミング