1. 基本等价性
class MyClass:
def method(self, x):
return x * 2
obj = 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:
@property
def 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) |
---|---|---|
多态支持 | ✅ 是 | ❌ 否 |
继承行为 | 动态绑定 | 静态绑定 |
代码清晰度 | 高 | 低 |
使用频率 | 常用 | 特殊情况 |