【问题标题】:What's the difference between functions w/ and w/o parentheses?带括号和不带括号的函数有什么区别?
【发布时间】:2021-01-29 16:01:02
【问题描述】:

现在我正在阅读 Think Python,目前正在阅读第 4 章,但我有一个问题。

在 4.1 的海龟模块中,有这样的东西:

>>> import turtle

>>> bob = turtle.Turtle()

这真的让我很困惑。我认为不带括号的函数名(如 print、math.sqrt 或 int)代表函数对象,带括号的函数名代表该函数的返回值。所以我认为turtle.Turtle() 应该表示该函数执行后的值。

但后来这本书告诉我: “turtle 模块(带有小写‘t’)提供了一个名为 Turtle(带有大写 ‘T’)的函数,它创建了一个 Turtle 对象,我们将其分配给一个名为 bob 的变量。”

好的,然后我试了一下。当 bob 被分配turtle.Turtle() 时,我得到:

>>> type(bob)

    <class 'turtle.Turtle>

但如果我做了 bob=turtle.Turtle,我得到了:

>>> type(bob)

    <class 'type'>

>>> print(bob)

    <class 'turtle.Turtle>

还有一件事让我很困惑......

我读这本书就像我的编程 101 书一样,所以我不知道它们是从哪里来的。 谁能回答这个问题并告诉我更多关于“对象”概念的信息?

【问题讨论】:

  • 您自己的描述很简单地解释了它,“我认为没有括号的函数名(如 print、math.sqrt 或 int)代表函数对象,而带括号的函数名代表对于该函数的返回值“虽然你正在使用一个类实例/类
  • @RussJ 不,这不是正在发生的事情。 turtle 是一个模块,Turtle 是该模块中的一个类(或者可能只是函数,但在本例中是一个类)。
  • "这真的让我很困惑。我认为没有括号的函数名(如 print、math.sqrt 或 int)代表函数对象,而带括号的函数名代表该函数的返回值。”这基本上是正确的。更准确地说,带括号是一个函数调用表达式,它计算函数的返回值。我
  • “‘对象’的概念在教程中被广泛介绍。您可以在互联网上找到许多很棒的教程,但 Stack Overflow 不是其中之一。请拨打tour,并阅读How to Askwhat's on-topic。欢迎使用 Stack Overflow!
  • 是的,所以,Python 是一种面向对象的语言,everything 是一个对象。整数、字符串、浮点数、None、函数等。基本上,就目前而言,您可以将对象视为可以分配给变量的任何东西。所以如果你能做到x = &lt;whatever&gt; 那么“whatever”就是一个对象。

标签: python function object


【解决方案1】:

turtle.Turtle 是一个类,而不是一个函数(尽管两者都在一个称为“可调用对象”的类中,你可以在后面加上括号来触发其他代码执行)。当你没有调用它时,你只是给类本身起别名; bob = turtle.Turtle 只是给你另一个名字,你可以用它来构造 turtle.Turtle 对象,所以你可以(如果你喜欢),这样做:

bob = turtle.Turtle
myturtle = bob()
myturtle2 = bob()

作为一种避免输入全名的方法,同时获得与以下相同的效果:

myturtle = turtle.Turtle()
myturtle2 = turtle.Turtle()

在这种情况下,type(bob) 返回 &lt;class 'type'&gt;,因为 Python 类本身就是“元类”的实例;如果没有另外指定,它们是type(所有类的最终根元类)的隐式实例。

基本上,你的书有点不精确(它是一个类,而不是一个函数),但它在行为上是正确的; bob = turtle.Turtle() 创建 turtle.Turtle 的实例,bob = turtle.Turtle 只是别名 turtle.Turtle 到一个新名称bob,而不实际创建它的实例。

【讨论】:

  • 说的太详细了!非常感谢,确实有帮助。
【解决方案2】:

在 4.1 的海龟模块中,有这样的东西:

import turtle

bob = turtle.Turtle()

这真的让我很困惑。我认为一个函数名没有 括号(如 print、math.sqrt 或 int)表示函数 对象,带括号的函数名代表返回值 那个功能。所以我认为turtle.Turtle() 应该意味着价值 执行后的那个函数。

但后来这本书告诉我:“turtle 模块(带有小写的‘t’) 提供了一个名为 Turtle 的函数(带有大写的“T”),它创建 一个 Turtle 对象,我们将其分配给名为 bob 的变量。”

这两种说法都是正确的。在这种情况下,函数对象是turtle.Turtle

您可以使用语法turtle.Turtle() 返回一个Turtle 对象。您可以将 Turtle 对象视为函数返回的值。

好的,然后我试了一下。当 bob 被分配turtle.Turtle() 时,我得到:

type(bob)

&gt;&gt;&gt; &lt;class 'turtle.Turtle&gt;

但如果我这样做了:

bob=turtle.Turtle

我得到了:*

type(bob)

&gt;&gt;&gt; &lt;class 'type'&gt;

当你写 'bob = turtle.Turtle' 时,你并没有返回一个海龟对象,因为你没有使用括号。您实际上是在将 turtle.Turtle 函数分配给名为 bob 的变量。这与为turtle.Turtle 函数创建别名基本相同。

在你的例子中,如果你输入 type(bob()) 你会看到 bob() 返回一个 Turtle 对象。

【讨论】:

    猜你喜欢
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 2021-06-29
    • 2015-08-25
    相关资源
    最近更新 更多