小编典典

打印类的所有实例

python

对于Python中的类,如何定义一个函数以函数中定义的格式打印类的每个实例?


阅读 226

收藏
2020-12-20

共1个答案

小编典典

在这种情况下,我看到两个选择:

垃圾收集器

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

在这种情况下,所有引用都将作为弱引用存储在列表中。如果您经常创建和删除很多实例,则应在迭代后清理弱引用列表,否则会产生很多麻烦。

这种情况下的另一个问题是,您必须确保调用基类的构造函数。您也可以重写__new__,但是__new__实例化仅使用第一个基类的方法。这也仅适用于您所控制的类型。

编辑 :可以按照特定格式打印所有实例的方法,但实际上,它只是for-loops的一种变体。

2020-12-20