每次访问(或从/复制到)列表中的对象时,如何运行方法?

How to run a method every time an object is accessed (or copied from/to) in a list?

提问人:Bark Jr. Jr. 提问时间:11/13/2023 最后编辑:Bark Jr. Jr. 更新时间:11/13/2023 访问量:42

问:

我正在尝试在 Python 中使用 turtle 类时学习堆栈。基本上,我写了一个脚本来用画一个三角形。为此,我创建了一个 Shape 类,其中 size 和 turtle 作为参数。然后,当 Shape 对象初始化时,它会在屏幕上绘制一个给定大小的三角形(使用)。

我正在将这个 Shape 对象推送到堆栈上。实际上,使用 for 循环,我将 10 个三角形推到堆栈上!(即 10 个 Shape 对象。然后,一旦所有 10 个都在堆栈中,我将将它们从堆栈中弹出到另一个堆栈中。这应该重新绘制三角形(尽管顺序相反)。

我不知道如何让在三角形被弹出并复制并推入第二个堆栈时重新绘制三角形!我还尝试将“三角形的绘制”作为 Shape 类中的一种方法。这也没有用。我还尝试从函数(而不是对象)绘制三角形,但堆栈仅包含 None(因为该函数会绘制第一个三角形,然后返回 None)。

我怎样才能让它在三角形被“移到”另一个堆栈(弹出或推动)时绘制三角形?

这是我的代码:

import turtle
from stack import *

class Shape():
    def __init__(self, size, turtle):
        self.size = size
        self.half_size = int(self.size / 2)
        self.height = int((self.size**2 + self.half_size**2)**0.5)

        turtle.penup()
        turtle.setposition(self.half_size, -self.half_size)
        turtle.pendown()
        turtle.setposition(-self.half_size, -self.half_size)
        turtle.setposition(0, self.height - self.half_size)
        turtle.setposition(self.half_size, -self.half_size)
        turtle.penup()

WIDTH = 800
HEIGHT = 400

# initialize screen
turtle.setup(WIDTH, HEIGHT)
        
# create turtle window
window = turtle.Screen()
window.title('HW Set #3 - Problem #3: Turtle Shapes')

# get the turtle and hide it
t = turtle.getturtle()
t.hideturtle()

# initialize the two stacks (these are just lists)
s1 = getStack()
s2 = getStack()

for i in range(0 , 100, 10):
    push(s1, Shape(200 - i, t))

t.showturtle()

while not isEmpty(s1) == True:
    push(s2, pop(s1))
    print(s2)
Python 对象 方法 堆栈

评论

0赞 juanpa.arrivillaga 11/13/2023
因此,当您弹出和推送时,对象不会被复制。他们不知道堆栈(即列表)发生了什么。您必须编写执行此操作的代码。用于绘制的代码似乎在您的类中,因此通常,该代码仅在您实例化该类的对象时才会运行。但这只发生在这里:__init__Shapepush(s1, Shape(200 - i, t))
0赞 Bark Jr. Jr. 11/13/2023
这是有道理的。如果我将“绘图”代码移动到一个方法,我将需要调用该方法,当对象被弹出并推送到另一个列表时,这不会自动发生。我在 init 中使用“绘图”代码的唯一原因是我希望它在复制时会再次运行。这有意义吗?
0赞 juanpa.arrivillaga 11/13/2023
需要了解的关键是,您不会在任何地方创建这些对象的副本

答:

0赞 Perdi Estaquel 11/13/2023 #1

您必须扩展堆栈类并重新实现 push 和 pop...在 push(或 pop)内,画出三角形,然后调用原始堆栈的 push(或 pop)

评论

0赞 juanpa.arrivillaga 11/13/2023
没有堆栈类,无论如何,这听起来不应该是堆栈类的责任。