Python Snake类中head属性调用Turtle类方法的原理疑问
问题拆解与解释
1. 先搞懂self的作用
self是Python类方法的第一个参数,它指代当前正在创建的类实例本身。比如你写my_snake = Snake(),那self就代表my_snake这个具体的蛇对象。
类里用self.xxx定义的变量,是这个实例的专属属性,能在类的所有方法里共用:
self.segments = []:给每个蛇实例创建一个空列表属性,用来存蛇的身体段self.create_snake():调用当前蛇实例的create_snake方法self.head = self.segments[0]:给当前蛇实例加一个head属性,指向蛇的第一个身体段
2. self.segments的元素为什么是Turtle类对象
看create_snake方法的代码:
def create_snake(self): for _ in starting_position: segment = Turtle(shape="square") # 直接实例化Turtle类,生成一个Turtle对象 segment.penup() segment.color('white') segment.goto(_) self.segments.append(segment) # 把这个Turtle对象加到segments列表里
每次循环都会执行Turtle(shape="square")——这行代码就是创建一个Turtle类的实例(也就是那个白色小方块),然后把这个实例存到segment变量里,最后追加到self.segments列表中。
而且__init__方法里先初始化self.segments,紧接着就调用create_snake,所以当self.head = self.segments[0]执行时,segments已经被填满Turtle对象了,segments[0]就是第一个创建的Turtle实例。
3. 为什么self.head和self.segments元素能调用Turtle类方法
因为self.head本质上就是self.segments[0],而segments里的每个元素都是Turtle类的实例(对象)。在面向对象编程里,对象天生就能调用它所属类定义的方法,这是最基础的特性:
self.head.forward(20):head是Turtle对象,forward是Turtle类自带的方法,所以能直接调用self.segments[seg_number].goto(...):segments里的元素都是Turtle对象,goto是Turtle类的方法,自然能调用self.head.setheading(90)同理,setheading是Turtle类的方法,head作为Turtle对象,当然可以调用
整个流程串一遍
- 当你写
snake = Snake()时,Python自动执行__init__方法 __init__先给这个蛇实例创建一个空的segments列表- 调用
create_snake,循环生成3个Turtle对象(蛇的身体段),全部加到segments里 - 把
segments的第一个元素(第一个Turtle对象)赋值给蛇实例的head属性 - 之后调用
snake.move()或snake.up()时,本质就是让head或segments里的Turtle对象执行对应的动作
内容的提问来源于stack exchange,提问作者kannadaiski
相关产品推荐
相关产品推荐

