【发布时间】:2019-06-13 17:44:04
【问题描述】:
我一直在玩海龟图形,试图更好地理解对象,但遇到了一个小问题。我已经了解了 super() 函数并想使用它:
from turtle import Turtle, _Screen, Screen
class turtle(Turtle):
def __init__(self):
super().__init__(shape="circle")
wn = Screen()
tortoise = turtle()
所以如果我这样做,一切都会像魅力一样发挥作用。我得到了一个屏幕,我可以在我的海龟类上使用任何 Turtle 方法。
from turtle import Turtle, _Screen, Screen
class window(_Screen):
def __init__(self):
super().__init__()
self.setup(500,500)
self.screensize(1000,1000)
self.title("Title")
self.bgcolor("black")
wn = window()
这也很好用,我得到了我的要求:在带有滑动条的 500x500 盒子中的 1000x1000 的黑色窗口。没问题。但是,如果我想结合这些:
from turtle import Turtle, _Screen, Screen
class window(_Screen):
def __init__(self):
super().__init__()
self.setup(500,500)
self.screensize(1000,1000)
self.title("Title")
self.bgcolor("black")
class turtle(Turtle):
def __init__(self):
super().__init__(shape="circle")
wn = window()
tortoise = turtle()
它会显示屏幕,但我会从乌龟那里得到一个错误:
AttributeError: '_Screen' 对象没有属性 '_mode'
我一直在查看turtle模块,发现Screen()函数是这样做的:
def Screen():
"""Return the singleton screen object.
If none exists at the moment, create a new one and return it,
else return the existing one."""
if Turtle._screen is None:
Turtle._screen = _Screen()
return Turtle._screen
所以我修改了窗口类以包含以下内容:
from turtle import Turtle, _Screen, Screen
class window(_Screen):
def __init__(self):
Turtle._screen = Screen()
super().__init__()
#self.setup(500,500)
#self.screensize(1000,1000)
#self.title("Title")
#self.bgcolor("black")
class turtle(Turtle):
def __init__(self):
super().__init__(shape="circle")
wn = window()
tortoise = turtle()
它的工作原理是这样的,我会得到一个白色的窗户,上面有一只圆乌龟。但如果我取消注释 setup、screensize 或 bgcolor 部分,我会得到一个错误:
AttributeError: 'window' 对象没有属性 '_tracing'
或
AttributeError: 'window' 对象没有属性 'cv'
所以我必须在 window 类中的 __init__ 之前再次声明一些参数,以使这行得通。似乎我缺少一些东西。为什么乌龟继承了一切并且工作得很好,但是 _Screen 没有使用所有必要的参数进行初始化?
【问题讨论】:
标签: python python-3.x turtle-graphics super superclass