打印某个类的所有实例

2025-01-07 08:44:00
admin
原创
131
摘要:问题描述:使用 Python 中的类,如何定义一个函数来按照函数中定义的格式打印该类的每个实例?解决方案 1:在这种情况下,我看到两种选择:垃圾收集器import gc for obj in gc.get_objects(): if isinstance(obj, some_class): ...

问题描述:

使用 Python 中的类,如何定义一个函数来按照函数中定义的格式打印该类的每个实例?


解决方案 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__在实例化时仅使用第一个基类的方法。这也仅适用于您控制的类型。

编辑:根据特定格式打印所有实例的方法留作练习,但它基本上只是-loops 的一种变体for

解决方案 2:

你不需要导入任何东西!只需使用“self”。操作方法如下

class A:
    instances = []
    def __init__(self):
        A.instances.append(self) # suggested by @Herrivan
print('
'.join(A.instances)) #this line was suggested by @anvelascos

就这么简单。无需导入任何模块或库

解决方案 3:

您需要在您的类上创建一个静态列表,并向weakref每个实例添加一个,以便垃圾收集器可以在不再需要您的实例时清理它们。

import weakref

class A:
    instances = []
    def __init__(self, name=None):
        self.__class__.instances.append(weakref.proxy(self))
        self.name = name

a1 = A('a1')
a2 = A('a2')
a3 = A('a3')
a4 = A('a4')

for instance in A.instances:
    print(instance.name)

解决方案 4:

非常好且有用的代码,但它有一个大问题:列表总是更大并且永远不会被清理,要测试它只需print(len(cls.__refs__[cls]))在方法末尾添加即可get_instances

以下是该方法的修复get_instances

__refs__ = defaultdict(list)

@classmethod
def get_instances(cls):
    refs = []
    for ref in cls.__refs__[cls]:
        instance = ref()
        if instance is not None:
            refs.append(ref)
            yield instance
    # print(len(refs))
    cls.__refs__[cls] = refs

或者也可以使用 Wea​​kSet 来实现:

from weakref import WeakSet

__refs__ = defaultdict(WeakSet)

@classmethod
def get_instances(cls):
    return cls.__refs__[cls]

解决方案 5:

与几乎所有其他 OO 语言相同,将类的所有实例保存在某种集合中。

这种事你可以试一试。

class MyClassFactory( object ):
    theWholeList= []
    def __call__( self, *args, **kw ):
         x= MyClass( *args, **kw )
         self.theWholeList.append( x )
         return x

现在你可以这样做了。

object= MyClassFactory( args, ... )
print MyClassFactory.theWholeList

解决方案 6:

Python 没有与 Smallktalk 的 #allInstances 等效的东西,因为其架构没有这种类型的中央对象表(尽管现代 smalltalk 实际上也不像这样工作)。

正如另一位发帖者所说,您必须明确管理集合。他建议使用维护注册表的工厂方法,这是一种非常合理的方法。您可能希望使用弱引用来执行某些操作,这样您就不必明确跟踪对象处置。

解决方案 7:

目前尚不清楚您是否需要一次打印所有类实例或者在初始化它们时打印它们,也不清楚您所谈论的是您能够控制的类还是第三方库中的类。

无论如何,我会通过使用 Python 元类支持编写类工厂来解决这个问题。如果您无法控制该类,请手动更新__metaclass__您正在跟踪的类或模块。

有关更多信息,请参阅http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html

解决方案 8:

在我的项目中,我遇到了类似的问题,并找到了一个简单的解决方案,它也可能适用于列出和打印类实例。该解决方案在 Python 版本 3.7 中运行顺利;在 Python 版本 3.5 中出现部分错误。

我将从我最近的项目中复制粘贴相关的代码块。

instances = []

class WorkCalendar:

def __init__(self, day, patient, worker):
    self.day = day
    self.patient = patient
    self.worker= worker
def __str__(self):
    return f'{self.day} : {self.patient} : {self.worker}'

在 Python 中,该`__str__`方法最终决定了对象将如何以字符串形式进行解释。我`:`在花括号之间添加了,它们完全符合我对“Pandas DataFrame”类型的读取偏好。如果您应用这个小`__str__` 函数,您将看不到一些机器可读的对象类型描述 - 这对人眼来说毫无意义。添加此`__str__` 函数后,您可以将对象附加到列表中并根据需要打印它们。


appointment= WorkCalendar("01.10.2020", "Jane", "John")
instances.append(appointment)


对于打印,您的格式`__str__`将按默认格式工作。但也可以分别调用所有属性:


for instance in instances:

print(instance)
print(instance.worker)
print(instance.patient)

如需详细阅读,您可以查看来源:https://dbader.org/blog/python-repr-vs-str


相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2545  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1551  
  建筑工程全生命周期涉及从项目规划、设计、施工到运营维护等多个复杂阶段,每个阶段都产生和依赖大量信息。PLM(产品生命周期管理)系统作为一种整合数据、流程和人员的数字化解决方案,正逐渐成为建筑行业实现高效协同与可持续发展的关键支撑。通过数字化转型,PLM系统能够优化各阶段的工作流程,提升项目整体质量和效率,为建筑工程的全...
plm是什么软件   1  
  产品生命周期管理(PLM)系统在企业资源成本率优化方面发挥着至关重要的作用。通过构建有效的数据模型,PLM系统能够整合企业各个环节的数据,为资源成本的精准分析和优化提供有力支持。这不仅有助于企业降低成本,还能提升产品质量和市场竞争力。PLM系统概述PLM系统是一种用于管理产品从概念设计到退役全生命周期过程中所有信息和流...
PLM项目管理软件   1  
  产品生命周期管理(PLM)系统在现代企业的产品研发、生产与管理过程中扮演着至关重要的角色。它整合了从产品概念设计到产品退役的全生命周期数据与流程,助力企业提升效率、降低成本并增强创新能力。随着技术的不断发展,到 2025 年,PLM 系统将具备一系列核心功能模块,这些模块将深度影响企业的运营与发展。产品数据管理模块产品...
plm是什么意思   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用