鱼C论坛

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

[技术交流] 魔法方法-Python中的__init__()和__call__()函数

[复制链接]
发表于 2020-5-2 14:42:02 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 金刚 于 2020-5-10 11:38 编辑

在Python的class中有一些函数往往具有特殊的意义。__init__()和__call__()就是class很有用的两类特殊的函数。

__init__()
在Python中,__init__()函数的意义等同于类的构造器(同理,__del__()等同于类的析构函数)。因此,__init__()方法的作用是创建一个类的实例。

__call__()
Python中的函数是一级对象。这意味着Python中的函数的引用可以作为输入传递到其他的函数/方法中,并在其中被执行。
而Python中类的实例(对象)可以被当做函数对待。也就是说,我们可以将它们作为输入传递到其他的函数/方法中并调用他们,正如我们调用一个正常的函数那样。而类中__call__()函数的意义正在于此。为了将一个类实例当做函数调用,我们需要在类中实现__call__()方法。也就是我们要在类中实现如下方法:def __call__(self, *args)。这个方法接受一定数量的变量作为输入。
假设x是X类的一个实例。那么调用x.__call__(1,2)等同于调用x(1,2)。这个实例本身在这里相当于一个函数。

总结
那么,__init__()和__call__()的区别如下:
1. __init__()的作用是初始化某个类的一个实例。
2. __call__()的作用是使实例能够像函数一样被调用,同时不影响实例本身的生命周期(__call__()不影响一个实例的构造和析构)。但是__call__()可以用来改变实例的内部成员的值。

  1. class X(object):
  2.     def __init__(self, a, b, range):
  3.         self.a = a
  4.         self.b = b
  5.         self.range = range
  6.     def __call__(self, a, b):
  7.         self.a = a
  8.         self.b = b
  9.         print('__call__ with ({}, {})'.format(self.a, self.b))
  10.     def __del__(self, a, b, range):
  11.         del self.a
  12.         del self.b
  13.         del self.range
复制代码

  1. >>> xInstance = X(1, 2, 3)
  2. >>> xInstance(1,2)
  3. __call__ with (1, 2)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-2 14:47:51 | 显示全部楼层

之前发表文章总失败,所以写之前先试试能不能发表成功,要不然写的东西发送失败啥都没了,所以先试试了,没办法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 14:49:02 | 显示全部楼层
金刚 发表于 2020-5-2 14:47
之前发表文章总失败,所以写之前先试试能不能发表成功,要不然写的东西发送失败啥都没了,所以先试试了, ...

嗯,没事了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-21 12:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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