python---类.函数名(self) 和 self.函数名()的调用方式

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)
多态支持✅ 是❌ 否
继承行为动态绑定静态绑定
代码清晰度
使用频率常用特殊情况
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值