page contents

写了两年Python,我还是不懂self

这可能是Python面向对象里,最容易让新手"卡壳"的部分。很多人学会了怎么写self,却依然不明白它到底是什么。

attachments-2026-06-1XexMNeO6a2b634c417b9.png这可能是Python面向对象里,最容易让新手"卡壳"的部分。很多人学会了怎么写self,却依然不明白它到底是什么。

01 一段"照抄"的代码

第一次写类的时候,几乎每个人都会写出这样的代码:

class Student:
    def __init__(self, name, score):
        self.name = name
        self.score = score

    def is_pass(self):
        return self.score >= 60

教程会告诉你:

"这里一定要写self,不然会报错。"

于是你记住了:
写类方法,第一个参数必须是self。

但心里一直有个疙瘩:

self到底是个什么东西?

02 self不是关键字,只是一个参数名

先说结论:self不是Python的关键字,它只是一个约定俗成的参数名。

下面两段代码,在语法上完全等价:

# 写法一:约定俗成
def is_pass(self):
    ...

# 写法二:合法但会被同事打
def is_pass(this):
    ...

大家都用self,纯粹是因为Guido这么用、PEP这么推荐,跟着用就对了。

所以self的本质——就是一个普通参数。

03 方法调用的"隐藏翻译"

理解self的关键在于看清一件事。

创建一个对象并调用方法时:

s1 = Student("张三", 80)
s1.is_pass()

Python在背后做的事情,相当于把你的代码翻译成了:

Student.is_pass(s1)

s1.is_pass()就是Student.is_pass(s1)的语法糖。

对象s1被传给了方法的第一个参数,也就是self。

回到方法定义:

def is_pass(self):
    return self.score >= 60

这里的self,就是调用这个方法的那个对象本身。

04 用一句话总结self

一句话:

self = 当前实例对象

•self.name → 这个对象的 name•self.score → 这个对象的 score

没有self,方法就不知道该操作哪个对象的数据。

05 一个实验

写几行代码验证一下:

class Student:
    def who_am_i(self):
        print(id(self))

s1 = Student()
s2 = Student()

print(id(s1)) # 比如:2523808104400
s1.who_am_i() # 打印的id和上面一模一样

print(id(s2))
s2.who_am_i() # 打印的是s2的 id

self的id和你创建的对象完全一致。self就是s1、s2本身,没有别的。

06 为什么Python要这么设计?

大概有人会问:

为什么不像Java那样,隐式地给一个this?

答案还是那句老话:Python的哲学是"显式优于隐式"。

数据从哪来、方法属于类还是实例——这些都应该写清楚。self多打了几个字母,但换来的是代码更清晰,排查问题也更方便。

写在最后

理解了

self = 正在调用方法的那个对象

就算跨过了Python OOP的第一个坎。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

 

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

2123 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2228 文章
  3. Pack 2123 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章