打印类的所有实例

发布于 2021-01-29 19:30:30

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

关注者
0
被浏览
41
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

    垃圾收集器

    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的一种变体。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看