__call__和__init__有什么区别?风马牛不相及!
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详解(面试常问,工作常用)
4、C++的单例模式为什么不直接全部使用static,而是非要实例化一个对象?
点分享
点点赞
点在看