尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

别再死记 self 和 cls!Python 类方法底层逻辑一次性讲透

别再死记 self 和 cls!Python 类方法底层逻辑一次性讲透 重要提醒很多初学 Python 的小伙伴写面向对象代码时都有一个刻板印象实例方法第一个参数必须是 self类方法必须是 cls。一旦改个名字、少写一个参数代码直接爆红报错让人一头雾水。其实根本不用死记硬背self、cls 只是程序员的约定俗成压根不是 Python 关键字。今天咱们抛开刻板规则用最通俗的大白话拆解实例方法、自定义参数、报错根源、类方法的全部核心逻辑。一、颠覆认知实例方法的 self 可以随便改名首先纠正所有人的误区self 不是固定语法只是一个普通形参变量名。1. 常规写法人人都会我们最熟悉的 self 写法本质就是接收自动传入的实例对象class MathTool: # self 接收自动传入的实例对象 def add(self, a, b): return a b 创建实例对象 obj MathTool() 调用时Python自动把 obj 传给 self10、20 分别传给 a、b print(obj.add(10, 20)) # 输出 302. 魔改写法合法且正常运行咱们直接把 self 改成 abc代码一点毛病没有运行结果完全一致class MathTool: # 把 self 换成任意变量名都行 def add(abc, a, b): return a b obj MathTool() 依旧正常输出30 print(obj.add(10, 20)) # 输出 30这里的 abc 和平时的 self 完全等价都是代表当前调用方法的实例对象。那为什么全网都默认用 self单纯是行业编码规范统一命名可读性更高仅此而已没有任何语法强制约束。二、高频报错深度解析少写 self 为什么会报错很多人踩过这个坑写实例方法时偷懒不写第一个参数直接定义两个形参调用就直接爆红TypeError: add() takes 2 positional arguments but 3 were given咱们用大白话拆解报错根源看完永远不会再错错误代码演示# 错误写法省略了实例方法的第一个占位参数 class MathTool: def add(a, b): return a b obj MathTool() 调用报错 print(obj.add(10, 20))报错底层逻辑核心重点实例方法的固定机制只要是对象调用实例方法Python 强制自动传入 1 个参数实例对象本身这个是底层机制无法跳过参数数量冲突我们定义的 add(a,b) 只接收2个形参但调用时实际传入了 obj、10、20 一共3个实参最终结果形参装不下实参直接触发参数数量不匹配报错。简单总结实例方法的第一个参数是专门用来「接住自动传入的实例对象」的占位符绝对不能省略。三、进阶升级类方法 classmethod 全解析搞懂了实例方法的 self 逻辑类方法的 cls 就一通百通了它和实例方法逻辑相似但作用完全不同。1. 类方法核心规则必须加装饰器classmethod标记第一个参数默认约定为 cls同样不是关键字可改名代表类本身而非实例对象调用方式灵活既可以用类名调用也可以用实例对象调用。2. 类方法代码示例class MathTool: # 定义类方法 classmethod def show_info(cls): # cls 代表当前类 MathTool print(f当前类名{cls.__name__}) 1. 类名直接调用推荐写法 MathTool.show_info() # 当前类名MathTool 2. 实例对象调用合法但不推荐 obj MathTool() obj.show_info() # 当前类名MathTool3. 类方法的权限边界高频考点很多人分不清类方法和实例方法的使用场景记住这一组核心区别即可可读可写类属性cls 指向类本身所以可以直接操作类的公共属性、修改类全局数据无法直接访问实例属性类方法没有 self 参数不绑定具体实例对象不能直接调用实例独有的属性和方法无实例绑定类方法属于类不属于某个具体对象所有对象共享同一个类方法。四、终极总结懒人速记版实例方法 self非关键字、可自定义命名接收实例对象必须占位用于操作实例属性参数报错根源对象调用实例方法必自动传1个实例参数少写占位参数必然参数溢出报错类方法 cls非关键字、可自定义接收类本身需classmethod装饰操作类属性、不访问实例属性命名规范self、cls 只是行业通用约定为了代码统一易懂生产环境禁止随意改名。写在最后Python 面向对象的语法从来不是死板的条条框框所有看似“固定”的规则底层都有清晰的运行逻辑。不用死记硬背搞懂谁调用、传什么参数、参数给谁接就能彻底搞定 self 和 cls再也不会踩坑
返回列表