python---类.函数名(self) 和 self.函数名()的调用方式
文章目录
- 1. 基本等价性
- 2. 重要区别
- 2.1 继承和多态
- 2.2 描述符协议
- 3. 使用场景
- 4. 总结
1. 基本等价性
class MyClass:def method(self, x):return x * 2obj = MyClass()# 这两种调用方式是等价的
result1 = obj.method(5) # self.method(5)
result2 = MyClass.method(obj, 5) # 类.方法(self, 5)print(result1, result2) # 输出: 10 10
2. 重要区别
2.1 继承和多态
class Parent:def method(self):print("Parent method")class Child(Parent):def method(self):print("Child method")obj = Child()# 这两种方式的行为不同
obj.method() # 输出: "Child method" (动态绑定)
Parent.method(obj) # 输出: "Parent method" (静态调用)
2.2 描述符协议
如果方法被包装成属性或有其他描述符行为,两种方式可能不同:
class MyClass:@propertydef method(self):return "property method"def real_method(self):return "real method"obj = MyClass()print(obj.method) # 输出: "property method" (作为属性访问)
print(MyClass.method) # 输出: <property object> (访问属性对象)
3. 使用场景
推荐使用 self.方法名()
1、大多数情况下
2、支持多态和继承
3、代码更清晰
使用 类.方法名(self) 的情况
1、需要显式调用父类方法时
2、需要绕过方法重写时
3、在某些元编程场景中
class Parent:def method(self):print("Parent")class Child(Parent):def method(self):# 先调用父类方法Parent.method(self) # 显式指定类print("Child")
4. 总结
特性 | self.方法名() | 类.方法名(self) |
---|---|---|
多态支持 | ✅ 是 | ❌ 否 |
继承行为 | 动态绑定 | 静态绑定 |
代码清晰度 | 高 | 低 |
使用频率 | 常用 | 特殊情况 |