函数call__call__(self)

`__call__` 是 Python 中一个**魔术方法(Magic Method)**,它允许一个对象像函数一样被调用。也就是说,如果你在一个类中定义了 `__call__` 方法,那么该类的实例就可以使用括号 `()` 来调用。 --- ## ✅ 一、`__call__` 的基本用法 ### 示例 1:让类的实例可调用 ```python class Greeter: def __call__(self, name): print(f"Hello, {name}!") g = Greeter() g("Alice") # 输出: Hello, Alice! ``` ### 解释: - `Greeter()` 创建了一个实例 `g` - `g("Alice")` 实际上调用了 `g.__call__("Alice")` --- ## ✅ 二、`__call__` 在元类中的作用 在元类中,`__call__` 方法控制的是**类被调用时(即创建实例)的行为**。 ### 示例 2:元类中的 `__call__` ```python class MyMeta(type): def __call__(cls, *args, **kwargs): print("调用元类的 __call__") return super().__call__(*args, **kwargs) class MyClass(metaclass=MyMeta): def __init__(self, name): self.name = name obj = MyClass("Test") ``` ### 输出: ``` 调用元类的 __call__ ``` ### 解释: - 当你执行 `MyClass("Test")` 时,实际上是调用了元类 `MyMeta` 的 `__call__` 方法 - 该方法负责调用类的 `__new__` 和 `__init__` 方法来创建并初始化实例 --- ## ✅ 三、`__call__` 和 `__new__`、`__init__` 的关系 | 方法 | 作用 | 调用时机 | |-------------|--------------------------------|----------| | `__new__` | 创建实例 | 创建对象前 | | `__init__` | 初始化实例 | 创建对象后 | | `__call__` | 控制类如何被“调用”(即实例化) | 创建实例时 | --- ## ✅ 四、实际应用场景 ### 场景 1:实现单例模式(如你之前看到的) ```python class SingletonMeta(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super().__call__(*args, **kwargs) return cls._instances[cls] ``` ### 场景 2:实现可调用对象,替代闭包或函数 ```python class Counter: def __init__(self): self.count = 0 def __call__(self): self.count += 1 return self.count c = Counter() print(c()) # 输出: 1 print(c()) # 输出: 2 ``` --- ## ✅ 五、总结 | 特性 | 说明 | |------------------|------| | `__call__` | 让对象可以像函数一样被调用 | | 可用于类和元类 | 控制实例创建过程 | | 常用于设计模式 | 如单例、工厂、装饰器等 | | 提高代码灵活性 | 可替代函数或闭包使用 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值