1. 实例方法 (Instance Method)
实例方法是最常见的方法类型,第一个参数默认是self
,代表实例本身。
class Student:
def study(self, subject): # 实例方法
print(f"学生正在学习{subject}")
特点:
- 第一个参数是
self
,代表实例本身 - 可以访问和修改实例属性和类属性
- 需要先创建类的实例才能调用
- 使用方式:
student.study("数学")
或Student.study(student, "数学")
2. 类方法 (Class Method)
类方法使用@classmethod
装饰器,第一个参数是cls
,代表类本身。
class Date:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
@classmethod
def from_string(cls, date_string): # 类方法
year, month, day = map(int, date_string.split('-'))
return cls(year, month, day)
特点:
- 使用
@classmethod
装饰器 - 第一个参数是
cls
,代表类本身 - 可以访问和修改类属性,不能访问实例属性
- 可以用于实现替代构造函数
- 使用方式:
Date.from_string("2024-12-09")
或date.from_string("2024-12-09")
3. 静态方法 (Static Method)
静态方法使用@staticmethod
装饰器,不需要传入实例或类引用。
class Calculator:
@staticmethod
def add(x, y): # 静态方法
return x + y
特点:
- 使用
@staticmethod
装饰器 - 不需要传入
self
或cls
参数 - 不能访问实例属性或类属性
- 相当于放在类中的普通函数
- 使用方式:
Calculator.add(1, 2)
或calculator.add(1, 2)
实例对象除了调用实例方法,还可以调用静态方法和类成员方法。但是类只能调用静态方法或类成员方法。
调用方式对比示例
class Example:
@classmethod
def class_method(cls):
return "这是类方法"
@staticmethod
def static_method():
return "这是静态方法"
def instance_method(self):
return "这是实例方法"
# 1. 通过实例调用
e = Example()
# 实例可以调用所有类型的方法
e.instance_method() # 正常调用
e.static_method() # 正常调用
e.class_method() # 正常调用
# 2. 通过类调用
Example.static_method() # 正常调用
Example.class_method() # 正常调用
Example.instance_method() # 错误!实例方法不能直接通过类调用
主要区别总结:
-
参数传递:
- 实例方法:自动传递实例对象(self)
- 类方法:自动传递类对象(cls)
- 静态方法:不自动传递任何参数
-
调用方式:
- 实例方法:需要先创建实例
- 类方法:可以通过类或实例调用
- 静态方法:可以通过类或实例调用
-
访问权限:
- 实例方法:可以访问实例属性和类属性
- 类方法:可以访问类属性,不能访问实例属性
- 静态方法:不能直接访问实例属性和类属性