首页 游戏 软件 资讯 排行榜 专题
首页
业界动态
为什么 Python 开发者总在代码里写 self?

为什么 Python 开发者总在代码里写 self?

热心网友
53
转载
2026-04-14

彻底搞懂Python中的self:从困惑到通透

在Python面向对象编程的世界里,有一个概念几乎是所有初学者的“第一道坎”,同时也是日常开发中无处不在的“老朋友”——它就是self。你是否也曾对着方法里满屏的self.nameself.age感到疑惑:这东西到底是个啥?为什么非得写?不写行不行?

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

今天,我们就来把这个最基础、也最核心的概念彻底拆解清楚。

一、误区:self 不是 Python 关键字

一个非常普遍的误解是,认为self是Python像ifdef一样的内置关键字,是语法强制要求的。

事实并非如此。

self根本不是什么关键字,它仅仅是一个被广泛接受的参数命名约定。你完全可以将它替换成thismeobj,甚至abc,代码一样可以正常运行。

那么,为什么全世界的Python程序员都默契地使用self呢?答案在于可读性与社区规范。这就像我们用英文为变量命名一样,并非语法强制,而是为了形成一种共识:只要看到self,所有人立刻明白它指向的是当前类的实例对象。遵守这个约定,是在为自己和团队的协作效率负责。

二、self 到底是什么?一句话讲透

用最直白的话说:self就是对当前类实例(对象)的引用

光说概念可能有点抽象,来看一个经典的Person类例子,一切就清晰了:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def introduce(self):
        print(f"我叫{self.name},今年{self.age}岁")

# 创建两个实例
ollie = Person("奥利", 25)
sarah = Person("萨拉", 28)

# 调用方法
ollie.introduce()  # 输出:我叫奥利,今年25岁
sarah.introduce()  # 输出:我叫萨拉,今年28岁

注意看,我们只定义了一个Person类,却用它创建了两个独立的人:奥利和萨拉。那么问题来了:当调用introduce方法时,Python如何知道应该打印奥利的信息,还是萨拉的信息?

关键就在于self

当我们执行ollie.introduce()时,Python会自动将ollie这个实例本身,作为第一个参数传递给introduce方法。此时,方法参数self接住的,正是ollie这个对象。因此,对奥利而言,self.name就是ollie.name;对萨拉而言,self.name就是sarah.name

简而言之,self就是实例自己,它的核心作用是标记“当前正在操作哪个对象”

三、为什么必须写 self?不写会怎么样?

很多初学者会感到困惑:既然创建实例时Python已经知道对象是谁了,为什么还要在方法里多此一举地写self

实践出真知。我们直接来看一个删掉self的反面例子:

class Person:
    def __init__(self, name, age):
        # 错误:删掉self,试图直接赋值
        name = name
        age = age

    def introduce(self):
        print(f"我叫{name},今年{age}岁")

ollie = Person("奥利", 25)
ollie.introduce()

运行这段代码,你会立刻得到一个NameError报错:

NameError: name 'name' is not defined

为什么会这样?根源在于Python严格的变量作用域规则。

__init__方法里直接写name = name,仅仅是在方法内部创建了一个同名的局部变量。这个方法执行完毕后,局部变量就被销毁了,它并没有被绑定到实例ollie上。因此,当后续调用introduce方法时,Python在局部和全局作用域中都找不到name这个变量,自然就会报错。

self.name = name这条语句,则完成了关键的一步:它将传入的name值,绑定为当前实例self的一个属性。从此,这个属性就“长”在了实例身上,无论通过哪个实例方法,只要通过self就能访问到它。

可以设想,如果没有self机制来隔离数据,那么奥利和萨拉的nameage就可能变成混乱的全局或类级变量,后创建的对象很容易覆盖前一个对象的数据。self的核心价值,正是为每个实例开辟独立的数据存储空间,实现对象之间的数据封装与隔离,而这恰恰是面向对象编程的基石。

四、self 的 3 个高频使用场景,新手必看

1. 实例方法的第一个参数,必须写 self

这是铁律:所有普通的实例方法,第一个参数必须是self。Python解释器在背后自动传递实例本身作为这个参数的值。作为开发者,你在调用方法时,完全无需手动传递self,只需关注self之后的其他参数。

错误写法示例:

class Person:
    # 漏写self参数
    def introduce():
        print("自我介绍")

ollie = Person()
ollie.introduce()  # 报错:introduce() takes 0 positional arguments but 1 was given

2. 访问实例属性 / 调用实例方法,必须加 self

只要在类的某个实例方法内部,你需要访问当前实例的属性,或者调用同一个类的另一个实例方法,都必须使用self.作为前缀。

正确写法示例:

class Person:
    def __init__(self, name):
        self.name = name

    def say_hello(self):
        print(f"你好,我是{self.name}")  # 访问实例属性,加self.
        self.say_bye()                   # 调用其他实例方法,加self.

    def say_bye(self):
        print(f"{self.name}说再见")

3. 类方法 / 静态方法,不用 self

当然,并非类中所有方法都需要self。有两种特殊方法例外:

  • 类方法(@classmethod):第一个参数是cls,代表当前类本身,常用于操作类属性。
  • 静态方法(@staticmethod):不需要实例或类的引用,相当于定义在类命名空间里的普通函数,与任何特定实例无关。
class Person:
    # 类属性:被所有实例共享
    total = 0

    def __init__(self, name):
        self.name = name
        Person.total += 1

    # 类方法,用cls
    @classmethod
    def get_total(cls):
        return cls.total

    # 静态方法,无self/cls
    @staticmethod
    def say_hi():
        print("你好呀")

总结来说,self是Python实现面向对象编程的身份标识符。它确保了每个实例都能拥有并管理自己独立的状态和行为,是数据封装和逻辑组织的关键。

理解self,不仅仅是记住一条语法规则,更是真正踏入Python面向对象编程大门的第一步。搞懂了它,你才能自如地运用类与对象来构建清晰、健壮的程序结构。

来源:https://www.51cto.com/article/839827.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

为什么 Python 开发者总在代码里写 self?
业界动态
为什么 Python 开发者总在代码里写 self?

彻底搞懂Python中的self:从困惑到通透 在Python面向对象编程的世界里,有一个概念几乎是所有初学者的“第一道坎”,同时也是日常开发中无处不在的“老朋友”——它就是self。你是否也曾对着方法里满屏的self name、self age感到疑惑:这东西到底是个啥?为什么非得写?不写行不行?

热心网友
04.14
Pika AI+Selves发布:亲手“养成”你的专属数字克隆人
AI
Pika AI+Selves发布:亲手“养成”你的专属数字克隆人

机器之心编辑部当大多数的 AI 厂商都在忙着打造更多 AI 工具的时候,一家以制作 AI 视频著称的公司居然开始制作「第二个你」了。近日,Pika 推出 AI Selves 产品,宣称可以生成「AI

热心网友
02.21
2026年大模型趋势:Self-Distillation实现持续学习新突破
AI
2026年大模型趋势:Self-Distillation实现持续学习新突破

机器之心编辑部2026 年刚拉开序幕,大模型(LLM)领域的研究者们似乎达成了一种默契。当你翻开最近 arXiv 上最受关注的几篇论文,会发现一个高频出现的词汇:Self-Distillation近

热心网友
02.10
港大携手Adobe发布突破性Self-E模型,赋能艺术创作
科技数码
港大携手Adobe发布突破性Self-E模型,赋能艺术创作

在人工智能绘图领域,传统方法就像一个谨小慎微的画家,需要反复涂抹几十次才能完成一幅画作。而现在,来自香港大学和Adobe Research的研究团队带来了一个令人惊喜的突破。这项由香港大学的余鑫、齐

热心网友
01.02
SLF币是什么?未来前景与价格预测全解析
web3.0
SLF币是什么?未来前景与价格预测全解析

Self Chain是一个第1层网路,SLF代币是Self Chain的原生资产,该资产由FRONT币转换而来,兑换比率为1:1,主要用于Gas费用、质押、治理、原生抵押品和交易费用等,那么,SLF(前FRONT)币是什么?SLF币未来如何?值得投资吗?下文将为大家全面介绍Self Chain(SLF)

热心网友
12.11

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

Lemonaid-AI音乐生成工具
AI
Lemonaid-AI音乐生成工具

Lemonaid是什么 如果你正为音乐创作寻找得力助手,那么Lemonaid很可能就是答案。它是一款专门面向专业音乐人打造的AI音乐生成工具,核心能力在于自主生成包含完整旋律、和声与节奏的乐曲。无论是想要一段氛围感十足的背景音乐,还是为具体场景定制配乐,它都能提供高度逼真且质量上乘的作品。工具提供了

热心网友
04.14
苹果折叠屏iPhone Ultra关键点汇总:这4个问题你肯定想知道
iphone
苹果折叠屏iPhone Ultra关键点汇总:这4个问题你肯定想知道

苹果也要出折叠屏,传闻已经有几年了,从目前供应链、分析师与知名爆料者释放的信息来看,这款与市面大折都不一样的阔折叠似乎已经蓄势待发,大概率今年下半年就要正式面市。今天我们就来为大家汇总一波,没准儿就有你想知道的消息。 关于苹果折叠屏手机的传闻,已经流传了好几年。如今,综合供应链、分析师以及各路知名爆

热心网友
04.14
《刺客信条4:黑旗 重制版》对手来了!被称为4A级海盗大作
游戏评测
《刺客信条4:黑旗 重制版》对手来了!被称为4A级海盗大作

《刺客信条:黑旗重制版》官宣之际,这款新海盗游戏为何能抢先赢得玩家口碑? 当游戏界的焦点都集中在《刺客信条:黑旗重制版》的正式公布时,一款名为《风启之旅》(Windrose)的开放世界海盗生存建造游戏,却凭借其过硬的品质与独特的玩法融合,悄然在玩家社区中掀起热议。这款由乌兹别克斯坦团队Kraken

热心网友
04.14
腾讯智影-智能视频创作与发布一体化平台
AI
腾讯智影-智能视频创作与发布一体化平台

产品介绍 提到云端智能视频创作,腾讯智影是一个绕不开的名字。这款由腾讯推出的平台,本质上是一个一站式的在线视频工厂,集成了从素材挖掘、剪辑、渲染到最终发布的全链路功能,旨在为用户提供全方位的视频创作解决方案。更吸引人的是,它不仅免费开放,还深度整合了多项前沿AI技术,目标很明确:让视频化表达这件事,

热心网友
04.14
比心被拒小哥回应:不尴尬 尊重Coser 大家当个乐子
游戏评测
比心被拒小哥回应:不尴尬 尊重Coser 大家当个乐子

《王者荣耀世界》线下活动风波:合影互动引争议,职业素养与网络舆论深度探讨 近日,《王者荣耀世界》的一场线下玩家见面会,因台上一次短暂的合影互动,意外成为全网热议的焦点。活动中,一位男粉丝上台与角色扮演者(Coser)合影时,主动做出比心手势以示友好,却未得到身旁Coser的任何回应。男生举着手势在原

热心网友
04.14