我创建了一个类Demo,其中添加了一个构造函数,其中包含一个空字典。使用类中的addSomething方法,我将键值对添加到此字典中。添加的键是str类型和int类型的值。在另一种方法中,useKeys在同一个类中,我想访问我添加到字典中的键。使用keys()方法,我只能得到类似于dict_keys([<__main__.Demo object at 0x7f7cd00c75b0>])的键。如何使添加的str可见?
代码
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__。我知道,如果这个类中的一个对象被打印出来,那么这个方法总是会被调用的。但是,如何使字典中的密钥可读性呢?我当前的实现并没有使键具有可读性:
def __str__(self):
return "{self.something}".format(self=self)发布于 2022-06-21 05:27:26
使用类中的addSomething方法,我将键值对添加到此字典中。被添加的键是str类型和int类型的值。
不,它不是。添加的键为Demo类型,值为int类型。这就是为什么打印字典键要打印Demo对象的Demo。
如何使添加的str可见?
您没有添加任何str。在代码中作为参数传递的字符串永远不会使用。
您可以编写__repr__函数(它将覆盖每个python3类继承的名称相同的object对象函数),也可以使用您已经提供的参数someString,而且根本没有使用它,这只是迫使您在创建Demo对象的新实例时提供一个字符串:
解决方案1
实际上,从addSomething函数中的构造函数中使用属性addSomething。
使用此解决方案,关键确实是str类型。
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,但当您打印该键时,它将显示一个字符串。
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__函数在另一种情况下使用,在您的需求中不需要它。
发布于 2022-06-21 05:27:38
您只需将其转换为一个列表,以便于表示:
print(list(something1.useKeys()))顺便说一下,您正在实现的类似乎已经以collections.Counter的形式存在。
https://stackoverflow.com/questions/72695291
复制相似问题