【问题标题】:Why is `print(object)` displaying `<__main__. object at 0x02C08790>`?为什么 `print(object)` 显示 `<__main__.对象在 0x02C08790>`?
【发布时间】:2023-01-19 01:36:23
【问题描述】:

我不断得到

<__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)

【问题讨论】:

  • 你打印一个 Speed_Camera 对象。你能指望什么?
  • 您的代码有缩进错误,并且没有定义任何名为 Speed_Camera 的内容。另外,你从来没有说过你想让程序做什么,所以没有人能告诉你如何让它做你想做的事。
  • @布伦巴恩。我将类的名称从 Speed_Camera 更改为 Camera,但没有更改其余代码。哎呀!对不起 :)
  • 打印该字符串的原因是因为您正在创建一个类的实例并打印它,但是该类本身没有定义当您在其上使用 print 时应返回的内容。您的类中的函数也没有被调用。
  • @JamesKent 所以如果我放一些类似“print (program.Calc_Speed()) i”的东西它会起作用吗?

标签: python python-3.x


【解决方案1】:

当你只打印一个对象时,它会显示对象 ID(如 &lt;__main__.Camera object at 0x02C08790&gt;),这对我们凡人来说是完全无法理解的。您可以通过定义 __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) + ">"

如果有一个带有起始变量值的Camera实例,它将返回

"&lt;__main__.Camera: distance = 2; speed_limit = 20; number_of_cars = 0&gt;"

&lt;__main__.Camera object at 0x02C08790&gt; 是系统记住它的方式,但除了显示它是什么类型的对象外,它几乎没有用。

【讨论】:

    【解决方案2】:

    与其打印对象本身,不如打印该对象的函数。如果您将最后一行替换为:

    print(program.Calc_Speed())
    

    该程序的工作方式与您似乎正在寻找的更相似。

    【讨论】:

      【解决方案3】:

      我为链接的封闭副本写了这个答案。因为它更详细地介绍了为什么输出看起来像这样,这显然是典型的问题,我把它放在这里。

      因为你正在打印一个目的, 然后目的没有 __repr____str__ 方法解释如何打印它。

      实施这些方法将让您打印对象的“描述”。

      背景

      当你在 python 中调用 print(thing) 时,print 会查看 thing 是否有 __str__ 方法,如果有则调用它。如果没有,它会查看是否有 __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__,它只是在某某 ram 地址打印它是 thing

      *好吧,它将应用 MRO,但我保持简单。

      【讨论】:

        【解决方案4】:

        我发现 Dash:

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

        【讨论】:

          【解决方案5】:

          我同意 Sandford Basset 你也可以试试

          程序.Calc_Speed()

          【讨论】:

            猜你喜欢
            • 2018-05-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-08-30
            • 1970-01-01
            相关资源
            最近更新 更多