我正在上python课程。我已经在论坛上询问过这方面的提示,但没有运气。我认为我的实施非常糟糕。我是非常新的,所以请耐心等待,即使我提出问题的方式。
上面的问题是我被告知我需要做的事情。我已经尝试了但没有运气,所以我来这里寻求帮助。
最终,我试图让我的主要处理程序回应我的按键。我以前做过这个,但我们还没有上课。这就是障碍所在。我应该实现类方法/变量来使它们工作,而不是使用新变量或新的全局变量。
e.g。
class SuchAndSuch:
def __init__(self, pos, vel, ang, ang_vel, image, info, sound = None):
self.pos = [pos[0],pos[1]]
self.vel = [vel[0],vel[1]]
self.angle = ang
self.angle_vel = ang_vel
self.image = image
def update(self):
# this is where all the actual movement and rotation should happen
...
下面的处理程序在SuchAndSuch类之外:
def keydown(key):
# need up left down right buttons
if key == simplegui.KEY_MAP["up"]:
# i'm supposed to just call methods here to make the keys respond???
...
因此,所有更新都应该发生在SuchAndSuch类中,而仅调用此更新应该在我的keyhandler中。
有人可以告诉我他们说这话时的意思吗?我尝试在我的密钥处理程序中实现的所有变量(或在论坛中给出的想法)错误为“未定义”。
答案 0 :(得分:8)
有两种方法可以从该类外部调用类的方法。更常见的方法是在类的实例上调用该方法,如下所示:
# pass all the variables that __init__ requires to create a new instance
such_and_such = SuchAndSuch(pos, vel, ang, ang_vel, image, info)
# now call the method!
such_and_such.update()
简单就是这样!方法定义中的self
参数是指调用该方法的实例,并作为第一个参数隐式传递给该方法。您可能希望such_and_such
成为模块级(“全局”)对象,因此每次按下某个键时都可以引用和更新同一个对象。
# Initialize the object with some default values (I'm guessing here)
such_and_such = SuchAndSuch((0, 0), (0, 0), 0, 0, None, '')
# Define keydown to make use of the such_and_such object
def keydown(key):
if key == simplegui.KEY_MAP['up']:
such_and_such.update()
# (Perhaps your update method should take another argument?)
第二种方法是拨打class method。这可能不是你真正想要的东西,但为了完整性,我将简要地定义它:一个类方法绑定到class
,而不是一个实例类即可。您使用装饰器声明它们,因此您的方法定义如下所示:
class SuchAndSuch(object):
@classmethod
def update(cls):
pass # do stuff
然后你可以在没有类的实例的情况下调用这个方法:
SuchAndSuch.update()