Pythonには正式な「無名クラス(anonymous class)」の構文は存在しません。
しかし、「名前を付けずにその場で使うクラスのようなもの」を実現する擬似的な手法はいくつかあります。
以下では、その考え方と具体例を段階的にわかりやすく解説します。
そもそも「無名クラス」とは?
無名クラス(anonymous class)は、その場で簡単に定義して使いたいクラスのことです。
たとえばJavaには以下のような無名クラス構文があります。
Button b = new Button() {
public void onClick() {
// 無名クラス
}
};
Pythonにはこれと同じような構文は存在しませんが、以下のようにlambdaのように「一時的なクラスっぽいオブジェクト」を作ることはできます。
type()
関数で無名クラスのようなものを作る
Pythonでクラスを動的に生成するには、type
関数を使う方法があります。
これを使うと、名前を定義せずにクラスを即席で作れます。
# 無名クラス的なオブジェクト
obj = type('MyClass', (object,), {
'greet': lambda self: print("こんにちは!")
})()
obj.greet() # 出力:こんにちは!
解説
type(クラス名, 基底クラスのタプル, メソッドや属性の辞書)
の形式'MyClass'
の部分はクラス名ですが、ここは形式上のもので、変数に束縛しなければ「名前なし」のように扱えます。- 最後の
()
は「その場でインスタンス化」しています。
# 変数には束縛されないので無名的に使える
result = (type('Temp', (object,), {'x': 42}))()
print(result.x) # 出力:42
SimpleNamespace
を使う(軽量な代替)
標準ライブラリ types
の中にある SimpleNamespace
を使えば、属性付きの軽量なオブジェクトを簡単に生成できます。
from types import SimpleNamespace
obj = SimpleNamespace(name="AI", age=30)
print(obj.name) # 出力:AI
print(obj.age) # 出力:30
これは「クラス定義せずに属性を持つオブジェクトを作る」方法で、クラスの代替品として「無名オブジェクト」的に使えます。
クラスをその場で lambda
のように定義して返す(ただし名前はある)
以下のように、その場でクラス定義して返す関数を使うことで、「無名クラスっぽい使い方」はできます。
def make_class():
class Temp:
def greet(self):
print("Hello from temp class")
return Temp()
obj = make_class()
obj.greet()
# 出力:Hello from temp class
ここではクラス自体に Temp
という名前がありますが、外部からはそれが見えないので「無名風」に使えます。
無名クラスが本当に必要な場面は?
Pythonでは、通常の関数(lambda
)、辞書、SimpleNamespace
、type()
を使った即席オブジェクトでほとんどの場面をカバーできます。
無理に「無名クラス」を使おうとするよりも、以下のようなケースに応じた適切な方法を選ぶのがPythonicです。
目的 | おすすめ手法 |
---|---|
属性付きのオブジェクト | SimpleNamespace |
1回だけ使う一時クラス | type() で即席生成 |
値だけ持つデータ構造 | dict または dataclass |
関数的なロジックだけ渡す | lambda |
まとめ

方法 | 特徴 |
---|---|
type() | メソッド付きクラスを即席で定義できる |
SimpleNamespace | 軽量な属性付きオブジェクト |
dict | 柔軟だが . アクセスできない |
関数で囲む方法 | クラス名を隠蔽して無名っぽく使える |
Pythonに「無名クラス」という明確な概念はないものの、これらの手法でほとんどのニーズに対応できます。
補足
Pythonでlambda
のように「一時的な構造を柔軟に作る」のは一般的ですが、可読性を損なうほど複雑なものを1行で書くのは避けた方がよいとされています。
そのため、用途に応じて素直にクラスを定義するのも立派な選択肢です。
以上、Pythonの無名クラスの作り方についてでした。
最後までお読みいただき、ありがとうございました。