python可调对象函数 可调用对象 python

python中__call__方法解析

__call__ 方法是python的魔术方法,就是增加一些特殊功能,我们来看看 __call__ 代表了什么意思?

创新互联服务项目包括定安网站建设、定安网站制作、定安网页制作以及定安网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,定安网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到定安省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

python中所有的东西都被称为对象,对象分为可以被调用和不可以被调用

可调用对象:许多Python对象都是我们所说的可调用的,即是任何通过函数操作符 () 来调用的对象

1.例如函数

函数是对象,可以被调用

2.但是如果是类的话会发生什么情况呢?

Python给类提供了名为 __call__ 的特别方法,该方法允许程序员创建可调用的对象(实例)。默认情况下, __call__ 方法是没有实现的,这意味着大多数情况下实例是不可调用的。

如何解决这一个问题?这里就用到 __call__ 函数

以上说明 __call__

python函数传对象对性能的影响

python函数传对象对性能有影响。在Python中,一切皆对象,Python参数传递采用的都是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值,相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象,相当于通过“传值’来传递对象,此时如果想改变这些变量的值,可以将这些变量申明为全局变量。

Python如何调用特殊函数

__call__

在Python中,函数其实是一个对象:

f = abs

f.__name__

'abs'

f(-123)

由于 f 可以被调用,所以,f 被称为可调用对象。

所有的函数都是可调用对象。

一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法__call__()。

我们把 Person 类变成一个可调用对象:

class Person(object):

def __init__(self, name, gender):

self.name = name

self.gender = gender

def __call__(self, friend):

print 'My name is %s...' % self.name

print 'My friend is %s...' % friend

现在可以对 Person 实例直接调用:

p = Person('Bob', 'male')

p('Tim')

My name is Bob...

My friend is Tim...

单看 p('Tim') 你无法确定 p 是一个函数还是一个类实例,所以,在Python中,函数也是对象,对象和函数的区别并不显著。

任务

改进一下前面定义的斐波那契数列:

class Fib(object):

???

请加一个__call__方法,让调用更简单:

f = Fib()

print f(10)

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

python 如何根据输入参数调用不同的函数

使用字典,比如下面这样:

def funcA():

pass

def funcB():

pass

def func_None():

print "cannot find func"

func_dict = {"a": funcA, "b": funcB}

def func(x):

return func_dict.get(x, func_None)()

在有switch的语言中,一般都是使用switch来根据入参进行判断。但是python中没有switch,因为根本不需要!!使用字典代替switch,性能更高,而且这种方法的表述能力更强一点。

另外func_dict.get(x, func_None)()中方法是从字典中取出值对应的函数对象,然后后面加上()是执行该对象的__call__方法。因为python中函数就是实现了__call__方法的对象。所以可以这么使用。

网站题目:python可调对象函数 可调用对象 python
分享地址:https://www.cdcxhl.com/article26/dopdjjg.html

成都网站建设公司_创新互联,为您提供网站维护小程序开发电子商务移动网站建设域名注册云服务器

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

h5响应式网站建设