深入理解Python中__call__方法的使用
本文详细解析Python中__call__特殊方法的用法。通过实现该方法,类实例可被直接调用,从而模糊函数与对象的界限。文章结合Person类及斐波那契数列示例,展示如何利用__call__简化代码调用逻辑,提升编程灵活性。
理解__call__方法基础
__call__
在Python语言中,函数本质上也是一个对象。
>>> f = abs
>>> f.__name__
'abs'
>>> f(-123)
因为函数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中,函数也是对象,函数与对象之间的区别并不明显。
应用__call__优化斐波那数列
任务
对之前定义的斐波那契数列进行改进:
class Fib(object):
???
请添加__call__方法,使调用方式更加简洁:
>>> f = Fib()
>>> print f(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
通过将实例对象以类似函数的形式呈现,进一步模糊了函数与对象之间的概念边界。
class Fib(object):
def __init__(self):
pass
def __call__(self,num):
a,b = 0,1;
self.l=[]
for i in range (num):
self.l.append(a)
a,b= b,a+b
return self.l
def __str__(self):
return str(self.l)
__rept__=__str__
f = Fib()
print f(10)
以上关于Python特殊方法__call__()的使用详解即为全部内容,希望能为大家提供参考,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









