Python方法(self参数理解)

Python方法(self参数理解)

🎯学习目标

深入理解Python方法中self参数的作用和意义,掌握实例方法、类方法和静态方法的区别,学会正确使用不同类型的方法。

📖核心知识点

self参数的本质

1
2
3
4
5
6
7
8
9
10
class Person:
def __init__(self, name):
self.name = name

# 实例方法:第一个参数必须是self,表示对象本身
def introduce(self):
return f"我叫{self.name}"

# 实际上Python是这样调用的:
# person.introduce() 等价于 Person.introduce(person)

三种方法类型对比

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Calculator:
# 类属性
PI = 3.14159

def __init__(self, brand):
self.brand = brand

# 实例方法:操作实例属性,必须接收self参数
def add(self, a, b):
print(f"使用{self.brand}计算器")
return a + b

# 类方法:操作类属性,使用@classmethod装饰器,接收cls参数
@classmethod
def get_pi(cls):
print(f"圆周率值是:{cls.PI}")
return cls.PI

# 静态方法:不操作类或实例属性,使用@staticmethod装饰器,无特殊参数
@staticmethod
def help_info():
print("这是一个计算器类,支持基本数学运算")
return "帮助信息"

方法调用方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建对象
calc = Calculator("卡西欧")

# 实例方法调用
result = calc.add(5, 3) # 通过对象调用:自动传递self
result2 = Calculator.add(calc, 2, 4) # 通过类调用:需要手动传递self

# 类方法调用
Calculator.get_pi() # 通过类调用:自动传递cls
calc.get_pi() # 通过对象调用:自动传递cls

# 静态方法调用
Calculator.help_info() # 通过类调用:无自动参数传递
calc.help_info() # 通过对象调用:无自动参数传递

self的底层原理

1
2
3
4
5
6
7
8
9
10
11
12
# Python方法调用的底层机制
class Test:
def method(self, x):
return self.value + x

obj = Test()
obj.value = 10

# 以下调用是等价的:
result1 = obj.method(5) # 常规调用
result2 = Test.method(obj, 5) # 显式传递self
result3 = obj.method.__func__(obj, 5) # 最底层调用

💻动手尝试

  1. 创建一个BankAccount类,包含:
    • 实例方法:存款、取款、查询余额
    • 类方法:获取银行利率
    • 静态方法:显示银行服务条款

测试代码:

1
2
3
4
account = BankAccount("1001", 1000)
account.deposit(500) # 实例方法
BankAccount.get_interest_rate() # 类方法
BankAccount.show_terms() # 静态方法

❗注意事项

  • 实例方法:必须包含self参数,用于操作实例属性
  • 类方法:使用@classmethod装饰器,包含cls参数,用于操作类属性
  • 静态方法:使用@staticmethod装饰器,无特殊参数,用于工具函数
  • self不是关键字,可以用其他名称,但强烈建议使用self(约定俗成)

🌟常见问题解答

Q:为什么Python方法必须显式声明self参数?
A:为了明确性,让开发者清楚地知道哪些变量是实例属性,哪些是局部变量

Q:什么时候使用类方法?什么时候使用静态方法?
A:需要访问类属性时用类方法,完全独立于类和实例时用静态方法

https://mp.weixin.qq.com/s/mlrFOHFoPYuZlWmbAK0xFA?scene=1