为什么`print(object)`显示为`<__main__. object at 0x02C08790>`?

14

我一直在收到

<__main__.Camera object at 0x02C08790>

而我不知道为什么。

我希望代码从Calc_Speed到Counter再回到Calc_Speed,形成一个循环。

class Camera():
    distance = 2
    speed_limit = 20
    number_of_cars = 0

    def Calc_Speed(self):
        registration = input("Registration Plate: ")
        Speeding_List=[]
        start = float(input("Start time: "))
        end = float(input("End Time: "))
        speed = self.distance/(end-start)
        print(("Average Speed: ") + str(round(speed, 2)) + (" mph"))
        if speed > self.speed_limit:
            list3= [str(self.registration)]
            Speeding_List.append(list3)
            print("Vehicles Caught Speeding: " + str(Speeding_List))
            return(program.Counter())
        else:
            print("Vehicle Not Speeding")
            return(program.Counter())

    def Counter():
        self.number_of_cars = self.number_of_cars + 1
        print("Number Of Cars Recorded: " + str(self.number_of_cars))                                 
        return(program.Calc_Speed())



program = Camera()
print(program)

2
你打印一个 Speed_Camera 对象。你期望什么? - Daniel
1
你的代码存在缩进错误,并且没有定义叫做Speed_Camera的东西。此外,你从未说明程序的目的,因此没有人能告诉你如何使其达到你的预期。 - BrenBarn
@BrenBarn。我把类的名称从Speed_Camera改为Camera,但没有改变其余代码。糟糕!对不起 :) - CoderLearner
你打印出那个字符串的原因是因为你创建了一个类的实例并将其打印出来,但是这个类本身没有定义在使用 print 时应该返回什么。此外,你类中的函数也没有被调用。 - James Kent
@JamesKent 如果我输入类似于 "print (program.Calc_Speed()) i" 这样的代码,它会起作用吗? - CoderLearner
显示剩余2条评论
5个回答

12

当你只是打印一个对象时,它会显示对象的ID(例如<__main__.Camera object at 0x02C08790>),这对我们凡人来说完全无法理解。你可以通过定义__str____repr__函数以自定义方式显示实例的数据来解决这个问题。

在你的情况下:

def __repr__(self):
    return "<__main__.Camera: distance = " + str(self.distance) + "; speed_limit = " + str(self.speed_limit) + "; number_of_cars = " + str(self.number_of_cars) + ">"
如果有一个起始变量值为distance=2, speed_limit=20, number_of_cars=0的Camera实例,它将返回 "<__main__.Camera: distance = 2; speed_limit = 20; number_of_cars = 0>"。"<__main__.Camera object at 0x02C08790>"是系统用于记忆对象的方式,除了显示对象类型外,它基本上无用。

4
与其打印对象本身,您需要打印该对象的一个函数。如果将最后一行替换为以下内容:
print(program.Calc_Speed())

这个程序的工作方式更符合你所寻求的。

1
我为一个已关闭的链接重复问题写下了这个答案。由于它更详细地解释了输出看起来像这样的原因,并且这显然是规范问题,所以我把它放在这里。
因为你正在打印一个对象,并且该对象没有一个__repr__或__str__方法来解释如何打印它。
实现这些方法将让你打印出你的对象的“描述”。
背景
当你在Python中调用print(thing)时,print会查看thing是否有__str__方法,如果有,则调用它。如果没有,则查看thing是否有__repr__方法,并调用它。如果没有,它会一直向上查找类层次结构,直到最终到达所有用户定义类继承的object类(现在是这样的…)。这就是你在这里看到的方法。
我们可以试一下:
>>> "I am a string".__str__()
"I am a string"
>>> "I am a string".__repr__()
"'I am a string'"

是的!在Python中,字符串是对象。事实上,所有东西都是对象。

>>> obj = object() # base class for all classes
obj.__str__()
'<object object at 0x7a87787987979877>'

这是后备的.__str__,只打印出它是一个在某个内存地址的thing

*好的,它会应用MRO,但我想保持简单。


0

我在 Dash 中找到了:

print(InputData.marker_value)
>>> <dash._callback.NoUpdate object at 0x7f52b29fdfa0>

print(InputData().marker_value)
>>> "value expected"

-1

我同意Sandford Basset的观点,你也可以尝试

program.Calc_Speed()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接