如何在课外使用方法?

时间:2013-06-05 15:14:07

标签: python class

我正在上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中。

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

1 个答案:

答案 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()