Python の匿名オブジェクト

Muhammad Maisam Abbas 2023年6月21日
  1. Python で namedtuple クラスを使用して匿名オブジェクトを作成する
  2. Python で type() 関数を使用して匿名オブジェクトを作成する
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'

最初に名前付きタプル anonymousClassnamedtuple("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

上記のコードでは、前の例の objectdict に置き換えました。

上記で説明した両方の方法には、互いに長所と短所があります。 どちらも明確な勝者ではなく、どちらがユースケースに依存します.

最終的に保存する値の数がわかっているが、複数の匿名オブジェクトが必要な場合は、namedtuple メソッドがより適切に機能します。 値の数がわからないが、匿名オブジェクトが 1つまたは 2つしか必要ない場合は、type() メソッドの方が適しています。

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

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

関連記事 - Python Object