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):
        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)
时间: 2024-10-14 15:31:45

python特殊函数 __call__()的相关文章

python的__call__

Python中有一个有趣的语法,只要定义类型的时候,实现__call__函数,这个类型就成为可调用的.换句话说,我们可以把这个类的对象当作函数来使用,相当于重载了括号运算符.>此话引用cnblogs的一位名叫dbblog的人. output:

[小知识]Python中__call__方法 @ Python

python中的__call__方法可以把class当做函数调用.例程如下: #coding=utf-8 class A(object): def __init__(self, x): self.x = x def __call__(self, y): return self.x * y C = A(10) #C这个instance可以当做函数来调用 print C(5) # 50

Python中__call__的用法

概念: Python中有一个有趣的语法,只要定义类型的时候,实现__call__函数,这个类型就成为可调用的.换句话说,我们可以把这个类型的对象当作函数来使用,相当于 重载了括号运算符.  示例: 所有的函数都是可调用对象.一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法__call__ ,我们把 Person 类变成一个可调用对象: class Person(object): def __init__(self, name, gender): self.name = name sel

Python类__call__()方法

在python中,创建类型的时候定义了__call__()方法,那这个类型创建出来的实例就是可调用的.例def如: class A(object): def __init__(self,name,age): self.name=name self.age=age def __call__(self): print("this is __call__ method") a=A('gt',17) a()------>this is __call__ method 原文地址:https

python __init__ __call__

__call__ 和 __init__半毛钱的关系都没有. 后者是构造类的实例时会调用的方法,并不是构造方法. 前者是在实例上可以呼叫的方法.代码示例如下: >>> class foo: def __init__(self): print "init" def __call__(self): print "call" >>> foo() init <__main__.foo instance at 0x0000000002C

python特殊函数 __cmp__

__cmp__ 对 int.str 等内置数据类型排序时,Python的 sorted() 按照默认的比较函数 cmp 排序,但是,如果对一组 Student 类的实例排序时,就必须提供我们自己的特殊方法 __cmp__(): class Student(object): def __init__(self, name, score): self.name = name self.score = score def __str__(self): return '(%s: %s)' % (self

python 类 __call__

__call__ 对象后面加括号,触发执行. 即:对象() 或者 类()() class dog(object): def __init__(self,name): self.name = name def eat(self): print("%s is eating %s" % (self.name,'ss')) def talk(self): print("%s is taking" % self.name) def __call__(self, *args,

python中__call__()方法的用法

__call__()的用法 __call__()方法能够让类的实例对象,像函数一样被调用: >>> >>> class A(object): def __call__(self, x): print('__call__ called, print x: ', x) >>> >>> a = A() >>> a('123') __call__ called, print x: 123 >>> 看a('1

复习python的__call__ __str__ __repr__ __getattr__函数 整理

class Www: def __init__(self,name): self.name=name def __str__(self): return '名称 %s'%self.name #__repr__=__str__ *这是在__str__转换__repr__函数的偷懒小方法 #__str__函数是可以直接把对实例进行调用并得到使用 '''交互模式: 方法一>>> print(Www('实验')) 方法二>>> s=Www('实验') >>>