查看原文
其他

__call__和__init__有什么区别?风马牛不相及!

IT服务圈儿 2023-02-06

The following article is from 麦叔编程 Author 麦叔

来源丨经授权转自 麦叔编程(ID:maishucode)

作者丨麦叔

风马牛不相及

这是某位麦友提的问题,可惜我忘记记录名字了。如果当事人看到,请在评论留言,我给你置顶,感谢。

麦叔之前有讲过python的 __call__(),__get__, __getattr__, __getattribute__这几个方法吗,网上搜索的讲的都不透彻,烦请麦叔讲解下吧😭

今天就先来说一下__call__吧。

网上好像有很多人搜:init和call的区别。所以就用了这个标题。

它们两个的区别是很大的,可以用风马牛不相及来形容。

看代码说话

__call____init__的差别,我们直接上代码代码吧:

class Person:
   def __init__(self):
      print("init")
      
   def __call__(self):
      print("call")


m1 = Person()
m1()
m1()
m1()

打印结果:

init
call
call
call

根据代码,我们来品味它们的区别:

  • __init__是对象的构造函数,用类(Person)来创建一个新实例的时候会调用一次,仅仅一次。
  • __call__会让对象实例变成一个可以被调用的对象,可以直接通过对象名()的方式调用。所以例子中我们可以写m1()。它其实就是一个普通的魔术函数,你想在里面做什么就做什么。

如果没有这个函数,我们直接调用m1()会产生如下错误:

TypeError: 'Person' object is not callable

有什么用呢?

它的意义和用法应该明白了吧?不明白就再看一遍,或者给我留言。

那这东西到底有什么用,在什么场合下用呢?最常用的地方就是类装饰器

讲解类装饰器估计三分钟不够,我就给一个简单的例子吧,如果大家有兴趣,请留言,我们可以给类装饰器专门来一个三分钟。

class MyDecorator(object):
   def __init__(self, f):
      self.f = f
      print("__init__()...")

   def __call__(self):
      print("__call__()...")
      self.f() 

@MyDecorator
def hello():
    print("hello...")


hello()
hello()
hello()

打印结果:

__init__()...
__call__()...
hello...
__call__()...
hello...
__call__()...
hello...

好啦,今天就聊到这里。如果喜欢本文,请帮忙转发。谢谢!


1、Spark的两种核心Shuffle详解(面试常问,工作常用)

2、惨,给Go提的代码被批麻了

3、小推理:React18比老版React更优秀的一个地方

4、C++的单例模式为什么不直接全部使用static,而是非要实例化一个对象?

5、从 IP 到 IP,聊聊计算机网络中那些“没用的”知识

点分享

点点赞

点在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存