网站首页 > 技术文章 正文
"为什么修改一个属性,所有对象跟着变?类方法中的cls参数有何魔力?静态方法为何不需要任何参数?3分钟彻底掌握Python面向对象高级技巧!"
一、类属性:所有对象共享的全局状态
定义位置:类内部、方法外部
核心特性:被该类的所有实例对象共享
class Student:
native_place = "吉林" # 类属性
def __init__(self, name, age):
self.name = name # 实例属性
self.age = age # 实例属性
实战演示:
# 创建两个实例
stu1 = Student("张三", 20)
stu2 = Student("李四", 30)
print(stu1.native_place) # 输出:吉林
print(stu2.native_place) # 输出:吉林
# 修改类属性(全局生效)
Student.native_place = "天津"
print(stu1.native_place) # 输出:天津
print(stu2.native_place) # 输出:天津
内存原理:
所有实例通过类指针访问同一份类属性数据
二、类方法:操作类本身的工具
定义方式:使用@classmethod装饰器
核心特性:
- 必须包含cls参数(指向类对象)
- 可通过cls访问和修改类属性
- 无需实例即可调用
class Student:
school = "清华大学"
@classmethod
def change_school(cls, new_school): # 类方法
cls.school = new_school # 通过cls修改类属性
print(f"学校已变更为{new_school}")
调用方式:
# 无需创建实例
Student.change_school("北京大学") # 输出:学校已变更为北京大学
关键区别:
类方法 vs 实例方法
特性 | 类方法 | 实例方法 |
装饰器 | @classmethod | 无 |
首参数 | cls(类对象) | self(实例对象) |
访问类属性 | 直接通过cls | 通过类名或self.__class__ |
调用方式 | 类名直接调用 | 需实例对象调用 |
三、静态方法:独立的工具函数
定义方式:使用@staticmethod装饰器
核心特性:
- 无强制参数(无self/cls)
- 不能访问类属性/实例属性
- 本质是放在类命名空间内的普通函数
class Student:
@staticmethod
def check_adult(age): # 静态方法
return age >= 18
@staticmethod
def utility_method(): # 静态方法
print("这是一个独立工具函数")
调用方式:
# 通过类名直接调用
print(Student.check_adult(20)) # 输出:True
Student.utility_method() # 输出:这是一个独立工具函数
三大使用场景:
- 与类相关但不需要访问类状态的工具函数
- 代码组织(将相关函数放在类内)
- 命名空间隔离
四、完整类结构示例
class Student:
# 类属性
school = "清华大学"
native_place = "吉林"
def __init__(self, name, age):
# 实例属性
self.name = name
self.age = age
# 实例方法
def introduce(self):
print(f"我叫{self.name},来自{self.native_place}")
# 类方法
@classmethod
def change_native_place(cls, new_place):
cls.native_place = new_place
print(f"籍贯已变更为{new_place}")
# 静态方法
@staticmethod
def check_age(age):
return age >= 18
"记住:类属性是共享的全局状态,类方法是操作类的工具,静态方法是独立的实用函数。掌握这三大利器,让你的Python面向对象编程如虎添翼!"
猜你喜欢
- 2025-08-06 中等生如何学好初二数学函数篇
- 2025-08-06 C#构造函数
- 2025-08-06 初中数学:一次函数学习要点和方法
- 2025-08-06 仓颉编程语言基础-数据类型—结构类型
- 2025-08-06 C++实现委托机制
- 2025-08-06 初中VS高中三角函数:从"固定镜头"到"360°全景",数学视野升级
- 2025-08-06 一文讲透PLC中Static和Temp变量的区别
- 2025-05-24 高中数学解题分析方法及知识点
- 2025-05-24 C/C++编程笔记:无法在C++中重载的函数,六种方式
- 2025-05-24 面试与实战:什么是 Lambda?该如何使用?
- 08-06中等生如何学好初二数学函数篇
- 08-06C#构造函数
- 08-06初中数学:一次函数学习要点和方法
- 08-06仓颉编程语言基础-数据类型—结构类型
- 08-06C++实现委托机制
- 08-06初中VS高中三角函数:从"固定镜头"到"360°全景",数学视野升级
- 08-06一文讲透PLC中Static和Temp变量的区别
- 08-06类三剑客:一招修改所有对象!类方法与静态方法的核心区别!
- 1522℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 649℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 527℃MySQL service启动脚本浅析(r12笔记第59天)
- 492℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 492℃启用MySQL查询缓存(mysql8.0查询缓存)
- 479℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 461℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 460℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (70)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)