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