zoukankan      html  css  js  c++  java
  • python--__call__

    __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]
  • 相关阅读:
    今年的第几天?
    特殊乘法
    abc
    求最大最小数
    二叉树遍历
    球的半径和体积
    成绩排序
    OC学习篇之---类的定义
    OC学习篇之---第一个程序HelloWorld
    OC学习篇之---类的初始化方法和点语法的使用
  • 原文地址:https://www.cnblogs.com/SCCQ/p/12285568.html
Copyright © 2011-2022 走看看