Menu
CoddyTech

self 就是对象本身

本课属于 Coddy Pygame 学习旅程的“精灵与图像”单元。第 12 课,共 39 课。

一个类可以创建任意数量的对象,每个对象都有自己的属性。给 __init__ 添加一个速度参数,两颗星星就可以以不同的速度下落:

slow = Star(200, 0, 1)
fast = Star(440, 0, 3)

当你写下 slow.update() 时,Python 会运行 Star.update(slow):self 就是 slow,所以 self.y += self.speed 会让 slow 移动 1。fast.update() 会在 self 为 fast 的情况下运行相同的代码行,让它移动 3。同一个方法,两个对象,彼此的数值互不影响。

因此,对象拥有的每个值前面都需要加上 self.。不带它的名称,比如 speed,是方法中的普通局部变量:方法结束时,它就会消失。

challenge icon

挑战

简单

创建两颗以各自速度下落的星星。

  1. 给 __init__ 添加第三个参数 speed,并将其存储为 self.speed。
  2. 将 star 替换为 slow = Star(200, 0, 1) 和 fast = Star(440, 0, 3)。
  3. 每一帧都更新并绘制两颗星星。

按“开始”:两颗星星以不同的速度下落。然后按“检查”。

亲手试试

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Falling Star")
clock = pygame.time.Clock()

class Star:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.speed = 2

    def update(self):
        self.y += self.speed
        if self.y > 480:
            self.y = 0

    def draw(self, screen):
        pygame.draw.circle(screen, (255, 255, 255), (self.x, self.y), 4)


star = Star(320, 0)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    star.update()

    screen.fill((20, 22, 40))
    star.draw(screen)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

精灵与图像中的所有课

自己练习: Pygame 在线编辑器