问题描述
我正在用Python学习OOP,却不明白为什么必须将“ turtle”放入函数“ draw()”的定义中。 该代码也可以在没有乌龟的情况下运行(只是“ def draw(self)” ...)-那么为什么我需要将其放到那里-或它到底能做什么?
class Circle:
def __init__(self, x=0, y=0, radius=50, color="transparent", \
outline="black", edgeWidth=1):
self.x = x
(...)
def draw(self, turtle):
turtle.penup()
turtle.goto(self.x, self.y)
(...)
1楼
turtle
是一个模块。
它是在全局名称空间中定义的,您可以从任何地方访问它(前提是您已正确导入模块中): import turtle
。
您无需将其作为参数传递给任何函数(除非您尝试执行问题中未指定的其他操作)。
即使从面向对象的角度来看,圆对象是否需要绘制turtle
听起来也不错?
对我来说,这听起来很奇怪,Circle对象知道如何在没有其他参数的情况下进行绘制(假设已经在构造函数中指定了需要绘制的所有数据)。
当然,指定绘制圆形的目标可能会有所帮助。
在这种情况下,可以使用附加参数,例如circle.draw(board)
(在此板上绘制自己)。
但是这里的board
应该是turtle
或非sigleton可绘制对象的包装。
在Python中, turtle
是一个模块,它使用的Screen
是sigleton,因此,基本上,您在它上所做的所有事情(即使在不同的圆圈上)都将绘制到同一位置。
好吧,为了完整起见, 您的教科书是这样的:
import turtle
t1 = turtle.Turtle()
t2 = turtle.Turtle()
在这里, t1
和t2
是两只不同的乌龟。
它们都将被绘制到同一屏幕上,但是它们彼此独立。
在这种情况下,有一个turtle
参数是有意义的,因为您可以这样做:
c1 = Circle()
c2 = Circle()
t1 = turtle.Turtle()
t2 = turtle.Turtle()
c1.draw(t1) # draw yourself but with the turtle 1
c2.draw(t2) # draw yourself but with the turtle 2
而且您将进入独立圈子。 在这种情况下,这很有意义,而且可能是文本的含义。
混乱的出现是因为你被点名的说法turtle
和调用它的函数从名称的方式中turtle
,因为turtle
也是一个模块是全局命名空间,那么你想知道这是否将是必要的。
现在您知道这两种方法,您就可以选择一种适合您的需求了:)
希望这可以帮助!