1. ホーム
  2. python

あるクラスのすべてのインスタンスを印刷する

2023-09-07 20:30:54

質問

Pythonのクラスで、クラスのすべてのインスタンスを関数で定義されたフォーマットで表示する関数を定義するにはどうすればよいですか?

どのように解決するのですか?

この場合、2つの選択肢がありますね。

ガーベッジコレクタ

import gc
for obj in gc.get_objects():
    if isinstance(obj, some_class):
        dome_something(obj)

これは、多くのオブジェクトがある場合、非常に遅くなるという欠点がありますが、コントロールできない型では動作します。

mixinとweakrefsを使用する

from collections import defaultdict
import weakref

class KeepRefs(object):
    __refs__ = defaultdict(list)
    def __init__(self):
        self.__refs__[self.__class__].append(weakref.ref(self))

    @classmethod
    def get_instances(cls):
        for inst_ref in cls.__refs__[cls]:
            inst = inst_ref()
            if inst is not None:
                yield inst

class X(KeepRefs):
    def __init__(self, name):
        super(X, self).__init__()
        self.name = name

x = X("x")
y = X("y")
for r in X.get_instances():
    print r.name
del y
for r in X.get_instances():
    print r.name

この場合、すべての参照は弱い参照としてリストに格納されることになります。もし、多くのインスタンスを頻繁に作成、削除するのであれば、反復処理後にweakrefのリストをクリーンアップする必要があります、さもなければ、多くの残骸が残ることになります。

この場合のもう一つの問題は、ベースクラスのコンストラクタを必ず呼び出さなければならないことです。また、オーバーライドして __new__ をオーバーライドすることもできますが、その場合は __new__ メソッドのみが使用されます。また、これは自分のコントロール下にある型にのみ作用します。

編集 : 特定のフォーマットに従ってすべてのインスタンスを印刷する方法は練習問題として残されていますが、基本的に、それは単に for -のループのバリエーションに過ぎません。