深入理解Python中__call__方法的使用

Ada
Ada
发布时间:2026-10-13 | 5人浏览过
原创

本文详细解析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__()的使用详解即为全部内容,希望能为大家提供参考,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表