程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

python魔法方法__call__详解

hfteth 2025-05-22 10:33:38 技术文章 17 ℃

你可能会看到别人的代码中,一个类实例化之后,还可以像函数一样调用使用,这可是太灵活了,你可能会疑惑,类的实例对象为什么这么有魔力,可以像函数那样调用使用,

这其中的魔力就是来自魔法方法__call__。

魔法方法__call__

在Python中,__call__是一个魔法方法,可以让对象被直接调用 ,就像函数一样。

当一个类实例被当作函数调用时,就会自动调用这个类的__call__方法。

基础用法

下面是一个简单的__call__使用示例:

import requests
class Search(object):
    def __init__(self,baseurl):
        self.baseurl=baseurl
    def get_html(self,url):
        return requests.post(url).json()
    def __call__(self,value):    #可以让类的实例以函数的方式调用
        url=self.baseurl+str(value)
        data = self.get_html(url)
        for i in data:
            print('name is %s'%i['name'])

创建Search实例,并调用

st='http://www.baidu.com'
search= Search(st)  #实例化一个类
search('?xx=python')   #像函数那样调用这个类

类装饰器

装饰器是一种特殊类型的函数,可以修改其他函数的功能或行为,而无需更改被修饰函数的源代码。它们在Python中广泛应用于日志记录、性能测试、权限校验等多种场景,极大地增强了代码的可重用性和灵活性。

利用类的__call__方法可以轻松实现装饰器功能,这种方式让装饰器本身更加模块化和可配置。当使用@形式将装饰器附加到函数上时,就会调用此方法。

代码示例:

class Foo(object):
    def __init__(self, func):
        self._func = func

    def __call__(self):
        print ('class decorator runing')
        self._func()
        print ('class decorator ending')

@Foo
def bar():
    print ('hello nihao')

像函数装饰器那样使用

bar()
class decorator runing
hello nihao
class decorator ending

通过这种方式,__call__魔法方法不仅增加了代码的可读性和灵活性 ,还为实现更高级的设计模式 ,如装饰器、策略模式等,奠定了基础。

最近发表
标签列表