网易首页 > 网易号 > 正文 申请入驻

Python:self 详解

0
分享至

在 Python 中,self 并不是语言关键字,而是实例方法中第一个参数的约定名称,指向调用该方法的实例对象。它的显式存在集中体现了 Python 的核心设计哲学:显式优于隐式、一切皆对象,以及简洁一致的调用模型。

一、self 的本质是什么

首先要知道的是,self 不是 Python 的关键字,也没有任何特殊语法含义。它只是实例方法中第一个参数的惯用名称,用于表示“当前对象的实例引用”。

例如:

        print("Woof!")

当我们执行:

d.bark()

Python 实际上在内部做了如下调用:

Dog.bark(d)

也就是说,self 就是调用该方法的对象实例 d。因此,bark() 方法能通过 self 访问对象的属性和其他方法。

二、为什么必须显式写出 self

很多面向对象语言(如 Java、C++)中有一个隐藏参数 this,它在方法中自动存在。Python 没有这样做,原因在于它的“一切皆对象”哲学:方法本质上就是函数对象,只是存放在类的命名空间中。

Python 不希望让“方法”成为一种特殊语法,而是通过普通函数与对象绑定的机制来实现方法调用。这种设计让函数、类、实例三者的关系更透明、更灵活。

Python 不会自动注入“实例引用”,必须显式声明第一个参数,社区约定俗成地命名为 self。

这使得方法调用规则简单且一致:任何函数若绑定到实例上,其第一个参数都会接收实例对象。

三、方法的绑定机制:self 如何被传入

要理解 self,首先需要了解方法在 Python 中是如何被绑定的。

当我们通过 实例.方法 的方式访问一个方法时,Python 会执行以下步骤:

1、在实例所属的类中查找该方法对应的函数对象。

2、如果找到该函数对象 f,则触发其 __get__() 方法(这是通过描述符机制实现的)。

3、__get__() 方法会返回一个绑定方法(bound method) 对象,该对象内部保存了当前实例的引用。

4、当我们调用这个绑定方法时,Python 会自动将保存的实例作为第一个参数(即 self)传入原函数。

示例说明:

a.show(10)

上述调用实际上等价于:

A.show(a, 10)

也就是说:

通过实例访问方法时,会得到一个已绑定实例的“绑定方法”,调用时自动传入 self。

通过类访问方法时,得到的仍是一个普通函数,调用时需要显式传入实例作为 self。

四、三种方法绑定的比较

Python 中存在三种类型的方法绑定方式:

方法类型

装饰器

第一个参数

隐式绑定对象

用途

实例方法

(无)self

实例

访问或修改实例状态

类方法

@classmethodcls

类对象

操作类本身(如工厂方法)

静态方法

@staticmethod(无)

工具函数,不依赖实例或类

示例:

        print("静态方法")

调用方式:

Example.static_method()    # 不传入任何对象

五、self 在继承与多态中的作用

self 永远指向实际调用该方法的对象。即使方法定义在父类中,被子类继承后调用时,self 仍然指向子类实例。

示例:

Dog().speak()  # Animal speaking: Dog

Animal.speak() 方法内部访问的 self,在运行时绑定为 Cat 或 Dog 实例,这就是多态(polymorphism)的基础。

六、super() 与 self 的协作

在继承中使用 时,Python 会根据方法解析顺序(MRO)找到父类的方法,但 self 不会变。

s.show()

输出:

Sub after

注意:super().show() 虽然调用了父类方法,但 self 仍然是 Sub 实例。

七、常见错误与误区

(1)方法定义中遗漏 self 参数

# TypeError: Bad.func() takes 0 positional arguments but 1 was given

异常原因:通过实例调用方法时,Python 会自动将实例本身作为第一个参数传入,但该方法定义没有预留接收该参数的位置。

(2)误以为 self 是固定关键字

实际上,self 只是约定俗成的参数名,可以使用任意名称替代:

        print(this)

但这样做违反了 Python 社区的编码规范,会严重损害代码的可读性和一致性。按照 PEP 8 约定,始终使用 self 表示实例方法的第一个参数,使用 cls 表示类方法的第一个参数。

(3)混淆类属性与实例属性

        self.count += 1  # 这里实际创建了一个新的实例属性!

如需修改类属性,应显式引用类名:

Counter.count += 1       # 正确修改类属性

八、self 的设计哲学

从语言设计的角度看,self 的设计体现了 Python 的几项核心理念。

(1)显式优于隐式(Explicit is better than implicit)

self 作为方法的第一个参数明确写出,清晰地表明了实例的传递过程,避免了像其他语言中隐藏的 this 指针所带来的隐式行为。

(2)一切皆对象

在 Python 中,方法本身也是对象。具体来说,是绑定到类中的函数对象。方法的绑定过程通过描述符协议实现,而非特殊的语法规则,这体现了 Python 对象模型的一致性。

(3)简洁一致的调用模型

无论是 obj.method() 还是 Class.method(obj),本质上都是将实例作为第一个参数传递给函数。这种设计消除了方法调用与函数调用之间的概念差异,保持了语义的一致性。

小结

在 Python 中,self 是实例方法中第一个参数的约定名称。通过 self,实例方法能够访问和修改对象的状态,并天然支持继承与多态特性。即使在通过 super() 调用父类方法时,self 依然正确地指向最初发起调用的实际对象。

因此,深入理解 self 不仅有助于掌握方法绑定的底层机制,更是透彻理解 Python 面向对象编程设计思想的重要基石。


点赞有美意,赞赏是鼓励

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
詹皇暴走造NBA神迹!东契奇46+7+11+单节20分,湖人终结公牛4连胜

詹皇暴走造NBA神迹!东契奇46+7+11+单节20分,湖人终结公牛4连胜

钉钉陌上花开
2026-01-27 11:21:53
紫金矿业:拟280亿元收购联合黄金100%股权

紫金矿业:拟280亿元收购联合黄金100%股权

每日经济新闻
2026-01-26 21:10:02
国运来了挡不住?这三个人,正用各自的方式“助攻”中国崛起

国运来了挡不住?这三个人,正用各自的方式“助攻”中国崛起

远方风林
2025-12-18 23:53:12
阿富汗教育部长:禁止女性走入学校

阿富汗教育部长:禁止女性走入学校

跟着老李看世界
2026-01-27 09:30:17
随着兰帕德率领头羊爆大冷门1-2,英冠最新积分榜出炉

随着兰帕德率领头羊爆大冷门1-2,英冠最新积分榜出炉

侧身凌空斩
2026-01-27 09:11:06
37岁莱万最后的宣言:请稍等,新王已在8000万欧元外候场?

37岁莱万最后的宣言:请稍等,新王已在8000万欧元外候场?

落夜足球
2026-01-27 09:30:59
炸穿!曼联 24 岁天才遭尤文疯抢,卡里克却连大名单都不给他进?

炸穿!曼联 24 岁天才遭尤文疯抢,卡里克却连大名单都不给他进?

奶盖熊本熊
2026-01-27 06:46:51
华裔政治家族,却遭特朗普清洗!特朗普如何扳倒“赵家人”?

华裔政治家族,却遭特朗普清洗!特朗普如何扳倒“赵家人”?

观察者海风
2026-01-20 15:14:58
加内特提名哈登入选全明星 快船作为东道主能入选两人吗?

加内特提名哈登入选全明星 快船作为东道主能入选两人吗?

仰卧撑FTUer
2026-01-27 09:45:13
14岁陈佳铭已昏迷超30天,上海专家会诊后,确认无生还希望

14岁陈佳铭已昏迷超30天,上海专家会诊后,确认无生还希望

李健政观察
2026-01-26 16:54:58
中央军在昆明兵变,将滇军包围缴械,却未注意城内还有中国远征军

中央军在昆明兵变,将滇军包围缴械,却未注意城内还有中国远征军

莲花盛开
2024-12-03 12:57:34
曼联连胜卡里克连夜分析比赛,不休假加班备战!拉爵直言非常满意

曼联连胜卡里克连夜分析比赛,不休假加班备战!拉爵直言非常满意

罗米的曼联博客
2026-01-27 09:56:39
杀猪宴后呆呆首场直播:辟谣不是23岁而是91年,未婚,并未入编!

杀猪宴后呆呆首场直播:辟谣不是23岁而是91年,未婚,并未入编!

天天热点见闻
2026-01-25 08:46:20
违反“限高令”25次乘机出国高消费,被执行人因拒执罪入刑

违反“限高令”25次乘机出国高消费,被执行人因拒执罪入刑

南方都市报
2026-01-26 11:17:15
法国第一美人消失25年,被救时竟已沦为46斤人畜,亲妈在阁楼里藏了整整25年的秘密终于曝光了

法国第一美人消失25年,被救时竟已沦为46斤人畜,亲妈在阁楼里藏了整整25年的秘密终于曝光了

历史回忆室
2026-01-02 19:54:11
500架巨额订单!巴基斯坦出口“枭龙”赚的钱,中国会有分成吗?

500架巨额订单!巴基斯坦出口“枭龙”赚的钱,中国会有分成吗?

军武次位面
2026-01-26 19:30:48
返乡跨省大单火了!5800公里赚 3.48 万,司机:订单结束手都在抖

返乡跨省大单火了!5800公里赚 3.48 万,司机:订单结束手都在抖

石辰搞笑日常
2026-01-26 13:38:42
安帅急了:最佳守门员没给李昊难以置信,日本门将总共才扑8个球

安帅急了:最佳守门员没给李昊难以置信,日本门将总共才扑8个球

茜子足球
2026-01-26 12:53:20
广州一曹操出行网约车连撞八车致1死4伤事故调查报告:司机带病驾驶且无从业资格

广州一曹操出行网约车连撞八车致1死4伤事故调查报告:司机带病驾驶且无从业资格

澎湃新闻
2026-01-27 09:37:06
火箭胜灰熊!申京33分主导起势,杜兰特低开高走,其余各将全在铁

火箭胜灰熊!申京33分主导起势,杜兰特低开高走,其余各将全在铁

篮球资讯达人
2026-01-27 11:27:57
2026-01-27 12:20:49
MediaTea
MediaTea
专业的数字媒体、新媒体技术
1726文章数 72关注度
往期回顾 全部

科技要闻

理想开始关店“过冬”,否认“百家”规模

头条要闻

斯塔默访华前:英国不必在美国和中国之间做选择

头条要闻

斯塔默访华前:英国不必在美国和中国之间做选择

体育要闻

带着母亲遗愿战斗12年,交易添头成了队魂

娱乐要闻

张雨绮被曝代孕,春晚被拒,代言跑路

财经要闻

金价狂飙 “牛市神话”未完待续

汽车要闻

宾利第四台Batur敞篷版发布 解锁四项定制创新

态度原创

教育
旅游
游戏
家居
艺术

教育要闻

浙江一县取消中考,初中生100%入普高!

旅游要闻

从腊八到元宵 四川大英12场主题活动邀您来过年

会说话的草丛?育碧经典射击IP新作地图定了!

家居要闻

现代古典 中性又显韵味

艺术要闻

日本东京国立博物馆中的100幅宋画

无障碍浏览 进入关怀版