类的高级特性
2026/6/29大约 4 分钟
1.对象属性和类属性
1.1 属性概述
属性是一个名词,用来描述事物的外在特征。
在类中,属性分为两种:
- 对象属性:属于每个对象
- 类属性:属于类
1.2 对象属性
对象属性定义在 __init__ 魔法方法中,每个对象都有自己的内容。
特点:
- 属于每个对象
- 每个对象的属性值可能都不同
- 修改A对象的属性,不影响对象B
- 只能通过
对象名.属性名的方式调用
class Student:
def __init__(self, name, age):
self.name = name # 对象属性
self.age = age # 对象属性
s1 = Student("张三", 38)
s2 = Student("李四", 28)
print(s1.name) # 输出:张三
print(s2.name) # 输出:李四
# 修改s1的属性不影响s2
s1.name = "王五"
print(s1.name) # 输出:王五
print(s2.name) # 输出:李四1.3 类属性
类属性定义在类中、函数外,能被该类下所有的对象所共享。
特点:
- 属于类
- 能被该类下所有对象所共享
- A对象修改类属性,B对象访问的是修改后的值
- 可以通过
类名.属性名或对象名.属性名的方式调用(推荐使用类名)
class Student:
teacher_name = "王老师" # 类属性
def __init__(self, name, age):
self.name = name
self.age = age
s1 = Student("张三", 38)
s2 = Student("李四", 28)
# 所有对象共享类属性
print(s1.teacher_name) # 输出:王老师
print(s2.teacher_name) # 输出:王老师
print(Student.teacher_name) # 输出:王老师
# 修改类属性(推荐使用类名)
Student.teacher_name = "小王老师"
print(s1.teacher_name) # 输出:小王老师
print(s2.teacher_name) # 输出:小王老师1.4 对象属性和类属性的区别
| 特性 | 对象属性 | 类属性 |
|---|---|---|
| 定义位置 | __init__ 方法中 | 类中、函数外 |
| 归属 | 属于每个对象 | 属于类 |
| 共享性 | 每个对象独立 | 所有对象共享 |
| 调用方式 | 对象名.属性名 | 类名.属性名 或 对象名.属性名 |
| 修改影响 | 只影响当前对象 | 影响所有对象 |
注意
- 修改类属性时,推荐使用
类名.属性名的方式 - 如果使用
对象名.属性名 = 值,会给该对象创建一个新的对象属性,而不是修改类属性
2.类方法
2.1 什么是类方法
类方法是属于类的方法,可以通过 类名.方法名 或 对象名.方法名 的方式调用。
定义要求:
- 必须使用装饰器
@classmethod - 第一个参数必须表示类对象(通常命名为
cls)
2.2 类方法示例
class Student:
school = "黑马程序员"
@classmethod
def show1(cls):
print(f"cls:{cls}")
print(cls.school)
print("我是类方法")
# 通过类名调用
Student.show1()
# 通过对象名调用
s1 = Student()
s1.show1()说明
@classmethod装饰器标识这是一个类方法cls参数代表类对象,可以访问类属性- 类方法可以通过类名或对象名调用
3.静态方法
3.1 什么是静态方法
静态方法是属于该类下所有对象所共享的方法,可以通过 类名.方法名 或 对象名.方法名 的方式调用。
定义要求:
- 必须使用装饰器
@staticmethod - 参数传不传都可以
3.2 静态方法示例
class Student:
school = "黑马程序员"
@staticmethod
def show2():
print(Student.school)
print("我是静态方法")
# 通过类名调用
Student.show2()
# 通过对象名调用
s1 = Student()
s1.show2()说明
@staticmethod装饰器标识这是一个静态方法- 静态方法没有特殊的参数要求
- 静态方法可以通过类名或对象名调用
4.类方法和静态方法的区别
| 特性 | 类方法 | 静态方法 |
|---|---|---|
| 装饰器 | @classmethod | @staticmethod |
| 第一个参数 | 必须是类对象(cls) | 无特殊要求 |
| 访问类属性 | 通过 cls.属性名 | 通过 类名.属性名 |
| 使用场景 | 需要访问类对象时 | 不需要访问类对象时 |
选择建议
- 如果函数中需要用到类对象(调用类属性),就定义成类方法
- 否则定义成静态方法
- 除此之外,并无任何区别
5.总结
| 概念 | 说明 |
|---|---|
| 对象属性 | 定义在 __init__ 中,属于每个对象 |
| 类属性 | 定义在类中函数外,属于类,所有对象共享 |
| 类方法 | @classmethod,第一个参数是类对象 |
| 静态方法 | @staticmethod,无特殊参数要求 |
