首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使字典中的对象可读

如何使字典中的对象可读
EN

Stack Overflow用户
提问于 2022-06-21 04:19:08
回答 2查看 91关注 0票数 0

我创建了一个类Demo,其中添加了一个构造函数,其中包含一个空字典。使用类中的addSomething方法,我将键值对添加到此字典中。添加的键是str类型和int类型的值。在另一种方法中,useKeys在同一个类中,我想访问我添加到字典中的键。使用keys()方法,我只能得到类似于dict_keys([<__main__.Demo object at 0x7f7cd00c75b0>])的键。如何使添加的str可见?

代码

代码语言:javascript
复制
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):
        #prints dict_keys([<__main__.Demo object at 0x7f7cd00c75b0>])
        print(self.something.keys())

something1 = Demo("ABC")
something2 = Demo("DEF")
something1.addSomething(something2)

print(something1.useKeys())

编辑

注释中的一个建议是使用__str__。我知道,如果这个类中的一个对象被打印出来,那么这个方法总是会被调用的。但是,如何使字典中的密钥可读性呢?我当前的实现并没有使键具有可读性:

代码语言:javascript
复制
def __str__(self):
        return "{self.something}".format(self=self)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-21 05:27:26

使用类中的addSomething方法,我将键值对添加到此字典中。被添加的键是str类型和int类型的值。

不,它不是。添加的键为Demo类型,值为int类型。这就是为什么打印字典键要打印Demo对象的Demo

如何使添加的str可见?

您没有添加任何str。在代码中作为参数传递的字符串永远不会使用。

您可以编写__repr__函数(它将覆盖每个python3类继承的名称相同的object对象函数),也可以使用您已经提供的参数someString,而且根本没有使用它,这只是迫使您在创建Demo对象的新实例时提供一个字符串:

解决方案1

实际上,从addSomething函数中的构造函数中使用属性addSomething

使用此解决方案,关键确实是str类型。

代码语言:javascript
复制
class Demo:
    def __init__(self, someString):
        self.something = dict()
        self.someString = someString # Actually using the string provided at instance time

    def addSomething(self, something):
        ## This method will use the attribute someString from object something instead
        if something.someString not in self.something:
            self.something[something.someString] = 0
        self.something[something.someString] += 1

    def useKeys(self):
        ## keys are now strings
        print(self.something.keys())

something1 = Demo("ABC")
something2 = Demo("DEF")
something1.addSomething(something2)

print(something1.useKeys())

解决方案2

重写__repr__,但无论如何都需要一个字符串,因此也需要从构造函数中使用someString

使用此解决方案时,键类型为Demo,但当您打印该键时,它将显示一个字符串。

代码语言:javascript
复制
class Demo:
    def __init__(self, someString):
        self.something = dict()
        self.someString = someString # Actually using the string provided at instance time

    def addSomething(self, something):
        ## This method will use the something object as in the original code
        if something not in self.something:
            self.something[something] = 0
        self.something[something] += 1

    def __repr__(self):
        ## When something1.__repr__ is called, it'll display the someString provided at instance time
        return self.someString

    def useKeys(self):
        ## keys are objects, but will appear as strings because of the __repr__ method from that object
        print(self.something.keys())

something1 = Demo("ABC")
something2 = Demo("DEF")
something1.addSomething(something2)

print(something1.useKeys())

对象的__str__函数在另一种情况下使用,在您的需求中不需要它。

票数 0
EN

Stack Overflow用户

发布于 2022-06-21 05:27:38

您只需将其转换为一个列表,以便于表示:

代码语言:javascript
复制
print(list(something1.useKeys()))

顺便说一下,您正在实现的类似乎已经以collections.Counter的形式存在。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72695291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档