成都创新互联网站制作重庆分公司

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
标题路径:http://cxhlcq.com/article/dopdjjg.html

其他资讯

在线咨询

微信咨询

电话咨询

028-86922220(工作日)

18980820575(7×24)

提交需求

返回顶部