【问题标题】:How to print all the instances of a class in python? [duplicate]如何在python中打印一个类的所有实例? [复制]
【发布时间】:2022-01-30 15:09:03
【问题描述】:

我想获取为一个类创建的所有实例。 有什么方法可以在不导入任何模块的情况下获取实例?

我尝试用这种方式将 self 附加到类属性中。

class A(object):
    instances = []

    def __init__(self, foo):
        self.foo = foo
        A.instances.append(self)
        
foo = A("hi")
bar = A("Hey")
star = A("Hero")

for instance in A.instances:
    print("Ins is ",instance)

输出

<__main__.A object at 0x148b8b6e0780>,
<__main__.A object at 0x148b8b6e0780>,
<__main__.A object at 0x148b8b6e0780>

我希望它打印 foo,bar,star。 有没有什么方法可以在没有任何模块的情况下在课堂上获得它?

【问题讨论】:

  • 假设你做了baz = foo。你希望它打印什么?
  • zyou 正在打印该类的实例。 “我希望它打印 foo,bar,star。” 为什么你会这样认为?如果我先x = 1 然后print(x),它会在屏幕上打印x1 吗?
  • 一般来说,你应该明确地提供一个对象应该知道的数据,通常作为构造函数的参数(一个花哨的名字是依赖注入) .如果你想让一个对象知道"foo",那么传入那个字符串。然后,您可以通过实现__repr__ 和/或__str__ 来修改该类型的默认打印行为。
  • 另请注意,您可以创建实例而无需将它们绑定到名称,例如在列表理解中。您的对象不应该关心它绑定到的名称。相反表明可能存在设计问题。
  • 如果你想依赖变量名,你必须经历各种类似this library 中看到的hijink(注意,如果你想了解python 内部结构,这是一本很好的读物,并且你会怎么做)。但真的,真的,你应该简单地keep data out of variable names。总而言之,虽然这是一个有趣的练习,看看如何做到这一点,你通常不应该围绕这个来设计你的代码

标签: python class oop attributes instance


【解决方案1】:

如果我没听错的话,您可以执行以下操作:

提案

tmp = globals().copy()
print(tmp)

for k,v in tmp.items():
    if isinstance(v, A):
        print(k)

您必须复制全局变量字典,否则 i 将随着 for 循环中的第一次实例化而改变:

结果:

foo
bar
star

【讨论】:

  • 这并不适用于任何地方。见信息here
【解决方案2】:

使用这个sn-p:

for instance in A.instances:
    print("Ins is ", (instance.__dict__).get("foo"))

输出:

Ins is  hi
Ins is  Hey
Ins is  Hero

或者:

for instance in A.instances:
    print("Ins is ", instance.__dict__)

输出:

Ins is  {'foo': 'hi'}
Ins is  {'foo': 'Hey'}
Ins is  {'foo': 'Hero'}

要打印一个对象,你可以把它变成一个字典。在这种情况下,这些值将是可打印的。

此方法通常用于将对象转换为字典,然后转换为JSON类型,广泛用于交换信息。

【讨论】:

    【解决方案3】:

    没有办法在类中定义这种行为,因为类在实例化后会为变量赋值。类实例化时无法获取变量名,因为该变量还不存在

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-29
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多