You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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方法没有返回值,直接调用方法即可,不需要在外层套print。

内容的提问来源于stack exchange,提问作者teres

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 14:09:29