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) # 最底层调用
|
💻动手尝试
- 创建一个
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