方法体不执行?

时间:2014-11-04 23:08:16

标签: python methods

我正在运行此python代码,并且遇到了accel函数的问题。当按下左右时,旋转方法工作正常,但是当按下向上时没有任何反应。我已经在调试器中逐步执行了代码,并且执行了my_ship.accel行,但它没有进入方法体,它只是继续,就好像那条线不存在一样。 Idk有什么不对请帮忙。此外,my_ship是Ship对象的名称,它在我的代码中被正确定义。

import simplegui
WIDTH = 800
HEIGHT = 600

class ImageInfo:
    def __init__(self, center, size, radius = 0, lifespan = None, animated = False):
        self.center = center
        self.size = size
        self.radius = radius
        if lifespan:
            self.lifespan = lifespan
        else:
            self.lifespan = float('inf')
        self.animated = animated

    def get_center(self):
        return self.center

    def get_size(self):
        return self.size

    def get_radius(self):
        return self.radius

    def get_lifespan(self):
        return self.lifespan

    def get_animated(self):
        return self.animated

    def change_center(self, new_center):
        self.center = new_center

# ship image
ship_info = ImageInfo([45, 45], [90, 90], 35)
ship_image = simplegui.load_image("http://commondatastorage.googleapis.com/codeskulptor-assets/lathrop/double_ship.png")

class Ship:
    def __init__(self, pos, vel, angle, image, info):
        self.pos = [pos[0],pos[1]]
        self.vel = [vel[0],vel[1]]
        self.thrust = False
        self.angle = angle
        self.angle_vel = 0
        self.image = image
        self.image_center = info.get_center()
        self.image_size = info.get_size()
        self.radius = info.get_radius()
        self.info = info
        self.accel = 10
        self.angle_accel = .1

    def draw(self,canvas):
        if not self.thrust:
            self.info.change_center(ship_center)
            canvas.draw_image(self.image, self.image_center, self.image_size, self.pos,     self.image_size, self.angle)
        else:
            self.info.change_center(thrust_ship_center)
            canvas.draw_image(self.image, self.image_center, self.image_size, self.pos, self.image_size, self.angle)

    def update(self):
        self.pos[0] += self.vel[0]
        self.pos[1] += self.vel[1]
        self.angle += self.angle_vel

    def accel(self):
        self.thrust = True
        self.vel[0] += self.accel
        self.vel[1] += self.accel

    def rotate(self, direction):
        if direction == "left":
            self.angle_vel -= self.angle_accel
        elif direction == "right":
            self.angle_vel += self.angle_accel
        else:
            print "error"

def keydown_handler(key):
    if key == simplegui.KEY_MAP['left']:
        my_ship.rotate("left")
    elif key == simplegui.KEY_MAP['right']:
        my_ship.rotate("right")
    elif key == simplegui.KEY_MAP['up']:
        my_ship.accel            
    elif key == simplegui.KEY_MAP['space']:
        self.angle_vel += self.angle_accel
def keyup_handler(key):
    if key == simplegui.KEY_MAP['left']:
        my_ship.rotate("right")
    elif key == simplegui.KEY_MAP['right']:
        my_ship.rotate("left")


my_ship = Ship([WIDTH / 2, HEIGHT / 2], [0, 0], 1, ship_image, ship_info)

1 个答案:

答案 0 :(得分:2)

此:

my_ship.accel            

不会调用方法my_ship.accel,只需2调用号码2即可。要在Python中调用某些内容,您需要使用括号。所以:

my_ship.accel()

(如果你想知道为什么Python会这样做,当其他语言,比如Ruby,不要......这就意味着你可以使用方法对象my_ship.accel作为一个值 - 存储它以便稍后调用,将其传递给map等。)


但是你还有另外一个问题。

您在accel个对象上定义方法Ship。但是,您还在10个对象上为self.accel分配了一个整数值Ship。 “self.accel无法同时表示两种不同的方法,包括方法和数字。那么,哪一个"赢了"?在这种情况下,self.accel = 10会在您构建Ship时发生,稍后会发生,因此它会获胜。

因此,当您撰写my_ship.accel时,您只需提及数字10。当您编写my_ship.accel()时,您正在尝试调用号码10,就像它是一个函数一样。因此TypeError

解决方案是不要为两个不同的东西重复使用相同的名称。通常,在名词之后的动词和属性之后命名函数是避免此问题的好方法 - 尽管您还必须避免使用无偿缩写,否则您可能会缩写accelerationaccelerate就像你在这里一样accel