带括号和不带括号的函数有什么区别?

时间:2021-01-29 16:01:02

标签: python function object

现在我正在阅读 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 书一样,所以我不知道它们来自哪里。 谁能回答这个问题并告诉我更多关于“对象”的概念?

2 个答案:

答案 0 :(得分:1)

turtle.Turtle 是一个类,而不是一个函数(尽管两者都属于一类被称为“可调用对象”的东西,您可以在后面加上括号以触发其他代码执行)。当你调用它失败时,你只是给类本身起了别名; bob = turtle.Turtle 只是为您提供了另一个可用于构造 turtle.Turtle 对象的名称,因此您可以(如果您愿意)执行以下操作:

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

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

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

本例中的 type(bob) 返回 <class 'type'>,因为 Python 类本身就是“元类”的实例;如果没有另外指定,它们是 type 的隐式实例(所有类的最终根元类)。

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

答案 1 :(得分:0)

<块引用>

在4.1的海龟模块中,有类似的东西:

import turtle

bob = turtle.Turtle()

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

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

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

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

<块引用>

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

type(bob)

>>> <class 'turtle.Turtle>

但如果我这样做了:

bob=turtle.Turtle

我得到:*

type(bob)

>>> <class 'type'>

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

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

相关问题