繁体   English   中英

在没有str方法的情况下从类中检索数据

[英]Retrieving data from a class without the str method

我有一个名为Collatz的类和一个创建该类对象的函数collatz_it ,我正在尝试使用collat​​z结构生成一个数字达到1的步数,并使用生成器生成相应的步骤直到100万

import collatz
values = {}
count = 0
#collatz.collatz_it(n)

def gen():
    n = 0
    x = 0
    while True:
        yield x
        n += 1
        x = collatz.collatz_it(n)

for i in gen():
    count += 1
    values[count] = i
    print values
    if count == 1000000:
        break

正如你所看到的,我使用了一个给定数字的collat​​z猜想生成了达到1所采取的步骤,并将其添加到具有相应数字的字典中, 但是当我打印出字典值时,它的输出很尴尬这个:

{1: 0}
{1: 0, 2: <collatz.Collatz instance at 0x01DCA580>}
{1: 0, 2: <collatz.Collatz instance at 0x01DCA580>, 3: <collatz.Collatz instance at 0x01DCDF58>}
{1: 0, 2: <collatz.Collatz instance at 0x01DCA580>, 3: <collatz.Collatz instance at 0x01DCDF58>, 4: <collatz.Collatz instance at 0x01DCDFA8>}
{1: 0, 2: <collatz.Collatz instance at 0x01DCA580>, 3: <collatz.Collatz instance at 0x01DCDF58>, 4: <collatz.Collatz instance at 0x01DCDFA8>, 5: <collatz.Collatz instance at 0x01DCDEB8>}
{1: 0, 2: <collatz.Collatz instance at 0x01DCA580>, 3: <collatz.Collatz instance at 0x01DCDF58>, 4: <collatz.Collatz instance at 0x01DCDFA8>, 5: <collatz.Collatz instance at 0x01DCDEB8>, 6: <collatz.Collatz instance at 0x01DCDE90>}
{1: 0, 2: <collatz.Collatz instance at 0x01DCA580>, 3: <collatz.Collatz instance at 0x01DCDF58>, 4: <collatz.Collatz instance at 0x01DCDFA8>, 5: <collatz.Collatz instance at 0x01DCDEB8>, 6: <collatz.Collatz instance at 0x01DCDE90>, 7: <collatz.Collatz instance at 0x01DE8940>}

如果我打印print i而不是print values我得到了所需的输出,这基本上是因为print语句触发了类中的__str__方法

我没有任何方法可以在没有输入<collatz.Collatz instance at 0x01DCDFA8>将实际步骤添加到字典中,是否有任何一种从__str__方法检索数据的方法,以便我的字典看起来像这样:

{1: 0}
{1: 0, 2: 1}
{1: 0, 2: 1, 3: 7}

任何Python容器的默认表示形式都是使用内容的repr()输出,而不是str()

解决方案是让你给collatz.Collatz()实例一个__repr__方法(你可以修补它),或者使用dict的子类,在显示内容时使用str()而不是repr()

__repr__修补猴子可能很简单:

collatz.Collatz.__repr__ = collatz.Collatz.__str__

当然,如果这是您自己的代码,只需在类主体中定义一个__repr__方法。

使用一个继承自dict的类,并拥有自己的__repr__ ,它__repr__您的需要。

将所需的值存储在此行中:

values[count] = i

做点什么

values[count] = i.value

要么

values[count] = str(i)

在最后一种情况下,假设您已为该类编写了__str__方法:

class Collatz:
...
def __str__(self):
    return str(self.value)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM