鱼C论坛

 找回密码
 立即注册
查看: 168|回复: 2

[已解决]__call__方法应用

[复制链接]
发表于 2024-9-19 13:38:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在创建对象时,是不是通过__call__方法调用new方法和init方法呢?如果不是call是如何运用和实现应用的,请举例演示一下
最佳答案
2024-9-19 13:48:21
本帖最后由 isdkz 于 2024-9-22 01:34 编辑

__call__做法是可调用对象在执行调用操作时执行的方法

而一个类在实例化的时候,例如Turtle(),在一个对象后面跟个括号实质上就是调用操作

这时候Turtle就作为一个可调用对象,即Turtle是由谁实例化而来,就调用了谁的__call__方法,一个类是由该类的元类实例化而来

所以一个类在实例化的时候,实际上是调用了这个类的元类的__call__方法,然后对这个类的__new__、__init__方法的调用,就是在这个类的元类的__call__方法中进行的,你的理解没有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-9-19 13:38:56 | 显示全部楼层
不是的,__call__方法与__new__和__init__方法是不同的。__call__方法是在一个对象像函数一样被调用时触发的,而__new__和__init__方法是用于创建对象时调用的。

下面我举个例子来说明__call__方法的应用:
class MyClass:
    def __init__(self, value):
        self.value = value
    
    def __call__(self, x):
        return self.value + x

# 实例化对象
obj = MyClass(10)

# 像函数一样调用对象
result = obj(5)

print(result)  # 输出:15

在上面的例子中:
1. `__init__`方法在对象创建时被调用,初始化`value`属性。
2. `__call__`方法允许我们使用`obj(5)`这种方式来调用对象,其中传递的参数5将被`__call__`方法接收并处理。

这样,你的对象就可以像函数一样被调用,并且可以执行一些自定义的操作。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-19 13:48:21 | 显示全部楼层    本楼为最佳答案   
本帖最后由 isdkz 于 2024-9-22 01:34 编辑

__call__做法是可调用对象在执行调用操作时执行的方法

而一个类在实例化的时候,例如Turtle(),在一个对象后面跟个括号实质上就是调用操作

这时候Turtle就作为一个可调用对象,即Turtle是由谁实例化而来,就调用了谁的__call__方法,一个类是由该类的元类实例化而来

所以一个类在实例化的时候,实际上是调用了这个类的元类的__call__方法,然后对这个类的__new__、__init__方法的调用,就是在这个类的元类的__call__方法中进行的,你的理解没有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 18:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表