【问题标题】:How do you call an instance of a class in Python?如何在 Python 中调用类的实例?
【发布时间】:2014-08-06 20:56:29
【问题描述】:

这是受我刚刚看到的一个问题“更改调用类实例返回的内容”的启发,但很快就得到了__repr__ 的回答(并被接受,因此提问者实际上并不打算调用该实例)。

现在可以像这样调用一个类的实例:

instance_of_object = object() 
instance_of_object()

但我们会收到错误消息,例如 TypeError: 'object' object is not callable

此行为在 CPython source here. 中定义

所以为了确保我们在 Stackoverflow 上有这个问题:

如何在 Python 中实际调用类的实例?

【问题讨论】:

  • 感谢您让 Stackoverflow 变得更好。在这里,有一个upvote :)
  • 供参考,启发性问题是this
  • 好的,这应该成为一个规范的问题。
  • 谢谢!我在一些源代码中看到了这种情况,想知道这里发生了什么。

标签: python class call


【解决方案1】:

你调用一个类的实例如下:

o = object() # create our instance
o() # call the instance

但这通常会给我们一个错误。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'object' object is not callable

我们怎样才能按预期调用实例,并可能从中得到一些有用的东西?

我们必须实现 Python 的特殊方法,__call__

class Knight(object):
    def __call__(self, foo, bar, baz=None):
        print(foo)
        print(bar)
        print(bar)
        print(bar)
        print(baz)

实例化类:

a_knight = Knight()

现在我们可以调用类实例了:

a_knight('ni!', 'ichi', 'pitang-zoom-boing!')

哪个打印:

ni!
ichi
ichi
ichi
pitang-zoom-boing!

我们现在已经成功地调用了该类的一个实例!

【讨论】:

    【解决方案2】:

    简短的回答是object 类没有__call__ 方法(您可以使用“dir(object)”检查)。创建类的实例时会调用__init__ 方法,调用实例时会调用__call__ 方法。

    【讨论】:

      【解决方案3】:

      为所有人投票! 感谢您发布问题并感谢您的回答。

      我想我会分享我的实现,以防万一帮助别人......

      我有一个类(称为 RTS),它包含一个我使用“get”访问的 SQL 查询。该类作为一个独立的端点工作得很好。现在我想在程序中调用那个类。

      使用上面的答案,我添加了以下内容:

      class RTS(Resource):
      def __call__(self):
          print("In RTS")
      
      def get(self, user_id):
          try: ...
      

      为了在程序的其他地方调用该类,我添加了:

      getGR = RTS.get(self, user_unique_id)
      

      瞧 - 我得到了相同的信息,我可以检查程序中返回的 Postman。

      【讨论】:

        猜你喜欢
        • 2021-07-21
        • 1970-01-01
        • 1970-01-01
        • 2014-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-31
        相关资源
        最近更新 更多