あるクラスのすべてのインスタンスを印刷する
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
-のループのバリエーションに過ぎません。
関連
-
[解決済み] プログラムの実行やシステムコマンドの呼び出しはどのように行うのですか?
-
[解決済み] リスト内のアイテムのインデックスを検索する
-
[解決済み] 関数内でグローバル変数を使用する
-
[解決済み] バイトを文字列に変換する
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] モジュールの関数名(文字列)を使って、モジュールの関数を呼び出す。
-
[解決済み] インスタンスのクラス名を取得する?
-
[解決済み】forループを使った辞書の反復処理
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
-
[解決済み] Pythonでマルチプロセッシングキューを使うには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pandasのデータフレームでタプルの列を分割するにはどうしたらいいですか?
-
[解決済み] Pythonのキャッシュライブラリはありますか?
-
[解決済み] PILからopenCVフォーマットへの変換
-
[解決済み] dict を txt ファイルに書き、それを読み取る?
-
[解決済み] データフレームをソートした後にインデックスを更新する
-
[解決済み] 文字列から先頭と末尾のスペースを削除するには?
-
[解決済み] Ctrl-CでPythonスクリプトを終了できない
-
[解決済み] Cythonのコードを含むPythonパッケージはどのように構成すればよいのでしょうか?
-
[解決済み] PyQtアプリケーションのスレッド化。QtスレッドとPythonスレッドのどちらを使うか?
-
[解決済み] Flaskで非同期タスクを作る