python特殊函数 __call__()

__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]


可以把实例对象用类似函数的形式表示,进一步模糊了函数和对象之间的概念

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)

原文参考:https://www.cnblogs.com/superxuezhazha/p/5793536.html

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 教程地址:python进阶 - 慕课网 python函数式编程 变量可以指向函数: f = absprint(f)...
    竹口小生阅读 592评论 0 2
  • 基础1.r''表示''内部的字符串默认不转义2.'''...'''表示多行内容3. 布尔值:True、False(...
    neo已经被使用阅读 1,719评论 0 5
  • 1.1==,is的使用 ·is是比较两个引用是否指向了同一个对象(引用比较)。 ·==是比较两个对象是否相等。 1...
    TENG书阅读 745评论 0 0
  • 携剑 腰挂三尺剑,逍遥行九州。 帝国城门立,笑谈十万军。 青衫犹未动,剑意震乾坤。 诸天欲亡吾,...
    携剑阅读 492评论 0 1
  • 晨 浓雾消散 城,渐渐热闹起来了 菜市,集市,街道 人,越来越多 熙熙攘攘热热闹闹 生活的气息被城轻轻渲染 ...
    588珊阅读 175评论 0 0