如何在课外使用方法?

Bia*_*nca 0 python class

我正在上python课程.我已经在论坛上询问过这方面的提示,但没有运气.我认为我的实施非常糟糕.我对此非常陌生,所以请耐心等待,即使我提出问题的方式.

上面的问题是我被告知需要做的事情.我试过没有运气,所以我来这里寻求帮助.

最终,我试图让我的主要处理程序回应我的按键.我以前做过这个,但我们还没有上课.这就是障碍所在.我应该实现类方法/变量来使它们工作,而不是使用新变量或新的全局变量.

例如

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
        ...
Run Code Online (Sandbox Code Playgroud)

下面的处理程序在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???

    ...
Run Code Online (Sandbox Code Playgroud)

因此,所有更新都应该发生在SuchAndSuch类中,并且只有对此更新的调用应该在我的keyhandler中.

有人可以告诉我他们说这话时的意思吗?所有变量(或论坛中给出的想法)我试图在我的密钥处理程序中实现错误为"undefined".

Hen*_*ter 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()
Run Code Online (Sandbox Code Playgroud)

就那么简单!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?)
Run Code Online (Sandbox Code Playgroud)

第二种方法是调用类方法.这可能不是你真正想要的,但为了完整起见,我将简要地定义它:一个类方法绑定到a class,而不是该类的实例.您使用装饰器声明它们,因此您的方法定义如下所示:

class SuchAndSuch(object):
    @classmethod
    def update(cls):
        pass # do stuff
Run Code Online (Sandbox Code Playgroud)

然后你可以在没有类的实例的情况下调用此方法:

SuchAndSuch.update()
Run Code Online (Sandbox Code Playgroud)