Python中如何让字典内自定义对象类型的键输出可读内容
问题描述
我创建了名为Demo的自定义类,在类的构造方法中初始化了一个空字典;通过类内的addSomething方法向该字典添加键值对,原本预期添加的键为str类型、值为int类型。但在类的useKeys方法中调用keys()方法访问字典键时,仅得到类似dict_keys([<__main__.Demo object at 0x7f7cd00c75b0>])的输出,无法看到可读的字符串内容。
复现代码
class Demo: def __init__(self, someString): self.something = dict() def addSomething(self, something): if something not in self.something: self.something[something] = 0 self.something[something] += 1 def useKeys(self): # 打印结果为 dict_keys([<__main__.Demo object at 0x7f7cd00c75b0>]) print(self.something.keys()) something1 = Demo("ABC") something2 = Demo("DEF") something1.addSomething(something2) print(something1.useKeys())
已尝试方案
根据建议实现了__str__方法,已知该方法会在打印类实例时被自动调用,但实现后依然无法让字典中的键展示为可读内容,当前__str__实现代码如下:
def __str__(self): return "{self.something}".format(self=self)
问题原因
代码存在两个核心问题:
- 构造方法接收的
someString参数没有绑定到实例属性,传入后直接被丢弃;调用addSomething时传入的是something2这个Demo类实例本身,不是预期的字符串,因此字典的键本质就是类实例对象,才会打印出带内存地址的默认对象表示。 - Python中字典、列表这类内置容器打印内部存储的元素时,会自动调用元素的
__repr__方法获取字符串表示,不会调用__str__,因此仅实现__str__完全不会影响字典内键的打印效果。
解决方法
根据实际设计需求二选一即可:
- 如果设计要求字典键为字符串类型:在构造方法中把传入的字符串存为实例属性,调用
addSomething时传入对应字符串属性即可,不需要额外实现魔术方法。 - 如果确实需要用
Demo实例作为字典键:给类实现__repr__方法,返回需要展示的可读字符串即可。
修正后的完整可运行代码如下:
class Demo: def __init__(self, someString): # 存储传入的字符串为实例属性 self.name = someString self.something = dict() def addSomething(self, something): if something not in self.something: self.something[something] = 0 self.something[something] += 1 def useKeys(self): print(self.something.keys()) # 实现__repr__方法,供容器打印元素时调用 def __repr__(self): return f"Demo('{self.name}')" something1 = Demo("ABC") something2 = Demo("DEF") # 若要使用字符串作为键,改为 something1.addSomething(something2.name) 即可 something1.addSomething(something2) something1.useKeys()
运行后输出为dict_keys([Demo('DEF')]),可正常展示可读内容。
注:原代码最后
print(something1.useKeys())会额外输出None,因为useKeys方法没有返回值,直接调用方法即可,不需要在外层套
内容的提问来源于stack exchange,提问作者teres
相关产品推荐
相关产品推荐

