码迷,mamicode.com
首页 > 编程语言 > 详细

python--__call__

时间:2020-02-08 23:18:55      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:rip   self   tle   一个   nbsp   python   call   class   ret   

__call__

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

>>> f = abs
>>> f.__name__
abs
>>> f(-123)
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):
        self.L = [0, 1]
    def __call__(self, num):
        i = 2
        while(i<num):
            self.L.append(self.L[i-1]+self.L[i-2])
            i = i + 1
        return self.L

f = Fib()
print (f(10))

运行结果

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

python--__call__

标签:rip   self   tle   一个   nbsp   python   call   class   ret   

原文地址:https://www.cnblogs.com/SCCQ/p/12285568.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!