如何在Python中获取类实例的名称并存入列表?
如何获取Python类实例的名称并存入字符串列表?
问题描述
想要获取Python类实例的名称,并将其以字符串形式存入列表中,尝试了以下代码:
l=[] l2=[] l3=[] l4=[] class Rolf(): def __init__ (self): l.append(self) # l2.append(*self) # ERROR: TypeError: list.append() argument after * must be an iterable, not Rolf l3.append(str(self)) # l4.append(str(*self)) # ERRORL TypeError: str() argument after * must be an iterable, not Rolf a = Rolf() b = Rolf() c = Rolf() print(f"1) No of instances= {len(l)}") print(f"2) List of instances= {l}") print(f"3) instances are of class type {str(l[0].__class__)}") print(f"4) for list 'l', Name of each instance= {i for i in l}") # print(f"5) for list 'l2', Name of each instance= {i for i in l2}") print(f"6) for list 'l3', Name of each instance= {i for i in l3}") # print(f"7) for list 'l4', Name of each instance= {i for i in l4}")
运行后输出:
1) No of instances= 3 2) List of instances= [<__main__.Rolf object at 0x7f8e3beb3fd0>, <__main__.Rolf object at 0x7f8e3beb39a0>, <__main__.Rolf object at 0x7f8e3beb3970>] 3) instances are of class type <class '__main__.Rolf'> 4) for list 'l', Name of each instance= <generator object <genexpr> at 0x7f8e3be9bca0> 6) for list 'l3', Name of each instance= <generator object <genexpr> at 0x7f8e3be9bca0>
尝试用l和l3存储实例名称,但得到的是对象的内存地址,请问在构造函数中应该使用什么正确语法,才能将创建的实例名称以字符串形式存入列表?
解决方案
首先要明确:Python中实例本身没有“名称”,你所说的“实例名称”其实是指向该实例的变量名(比如a、b、c)。默认情况下,str(self)返回的是对象的内存地址描述,所以需要通过以下两种方式实现需求:
方法一:初始化时手动传入变量名(推荐,可控性高)
在创建实例时,把变量名作为参数传给构造函数,直接存储名称字符串,还可以自定义__str__方法让实例的字符串表示返回名称:
instance_names = [] class Rolf(): def __init__(self, name): self.name = name instance_names.append(name) # 直接将名称字符串存入列表 def __str__(self): return self.name # 让str(self)返回实例名称 # 创建实例时传入对应的变量名 a = Rolf("a") b = Rolf("b") c = Rolf("c") print(f"实例数量: {len(instance_names)}") print(f"实例名称列表: {instance_names}") print(f"实例a的字符串表示: {str(a)}")
运行输出:
实例数量: 3 实例名称列表: ['a', 'b', 'c'] 实例a的字符串表示: a
方法二:反向查找变量名(不推荐,局限性大)
如果不想手动传参,可以遍历全局变量,查找指向实例的变量名,但这种方法存在缺陷:一个实例可能被多个变量引用,或者在局部作用域创建时无法被全局查找捕获,结果不可靠。
l = [] class Rolf(): def __init__(self): l.append(self) a = Rolf() b = Rolf() c = Rolf() # 遍历全局变量,筛选出指向l中实例的变量名 instance_names = [name for name, obj in globals().items() if obj in l] print(f"实例名称列表: {instance_names}")
运行输出:
实例名称列表: ['a', 'b', 'c']
额外修正:关于生成器对象的问题
你代码中{i for i in l}显示为生成器对象,是因为f-string中直接写生成器表达式不会自动展开,需要转成列表:{list(i for i in l)},这样就能正常显示实例内容。
内容的提问来源于stack exchange,提问作者Micklos
相关产品推荐
相关产品推荐

