Python の匿名オブジェクト
このチュートリアルでは、Python で匿名オブジェクトを作成する方法について説明します。
Python で namedtuple
クラスを使用して匿名オブジェクトを作成する
匿名オブジェクトは、実名のない単なる値です。 したがって、それは匿名と呼ばれます。
まったく新しいクラスを定義するよりも、値を保持するための匿名オブジェクトを作成する方が簡単な場合があります。
デフォルトでは、C# や Java とは異なり、Python プログラミング言語は Anonymous クラスをネイティブにサポートしていません。 しかし、少し工夫すれば、回避策を見つけて匿名オブジェクトの機能を模倣することができます。
手始めに、Python の collections
モジュール内で namedtuple
クラス を利用して、無名オブジェクトを模倣できます。 次のコードは、Python の namedtuple
クラスを使用して匿名オブジェクトを作成する方法を示しています。
from collections import namedtuple
anonymousClass = namedtuple("variables", ["foo", "woo", "boo"])
obj1 = anonymousClass(foo=1, woo=2, boo="3")
obj1.boo
出力:
'3'
最初に名前付きタプル anonymousClass
を namedtuple("variables", ['foo', 'woo', 'boo']
. 一時的な値を格納することになる変数名。
私たちのユースケースでは、コンストラクターのキーとして渡すものは何でも、結果にはあまり影響しません。 この anonymousClass
オブジェクトを使用して、obj1 = anonymousClass(foo=1, woo=2, boo='3')
で匿名オブジェクトを作成できます。
このメソッドの良いところは、anonymousClass
オブジェクトが再利用可能であり、好きなだけ無名オブジェクトを作成できることです。 このアプローチの主な欠点は、namedtuple
を初期化する際に変数の数を知る必要があることです。
Python で type()
関数を使用して匿名オブジェクトを作成する
匿名オブジェクトを宣言する別の方法は、Python の type()
関数 を使用することです。 type()
関数は 3つのパラメーターを取ります。 新しいデータ型の名前、その中の値のデータ型、および値のセット。
次のコード スニペットは、Python で type()
関数を使用して匿名オブジェクトの動作を模倣する方法を示しています。
obj = type("", (object,), {"foo": 1, "woo": 2, "boo": "3"})()
obj.boo
出力:
'3'
上記のコードでは、新しいデータ型の名前に対応する type()
関数の最初のパラメーターに空の文字列を渡しました。 2 番目のパラメーターは、object
として指定されたデータ型です。
3 番目のパラメーターは、キーと値のペアで指定される値のセットです。キーは変数の名前で、値は対応する値です。 以前のアプローチと比較して、このアプローチには長所と短所があります。
ここでの明らかな欠点は、前の例の anonymousClass
とは異なり、obj
を再利用してより多くの匿名オブジェクトを初期化できないことです。 このアプローチの利点は、最初に変数を宣言することなく、より多くの変数を指定できることです。
この type()
関数は、object
データ型の代わりに dict
を使用することで、最初に名前を指定せずに新しい値を組み込むように変更できます。 次のコード スニペットは、このメソッドの動作を示しています。
obj3 = type("", (dict,), {"foo": 1, "woob": 2})()
obj3.boo = 123
obj3.boo
出力:
123
上記のコードでは、前の例の object
を dict
に置き換えました。
上記で説明した両方の方法には、互いに長所と短所があります。 どちらも明確な勝者ではなく、どちらがユースケースに依存します.
最終的に保存する値の数がわかっているが、複数の匿名オブジェクトが必要な場合は、namedtuple
メソッドがより適切に機能します。 値の数がわからないが、匿名オブジェクトが 1つまたは 2つしか必要ない場合は、type()
メソッドの方が適しています。
Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.
LinkedIn