美文网首页
可调用对象

可调用对象

作者: mysimplebook | 来源:发表于2019-12-16 09:53 被阅读0次

我们知道在Python中,函数是一个对象。由于函数可以被调用,所以函数被称为可调用对象。所有的函数都是可调用对象。可调用对象的一个特点是直接可以使用“对象名(参数列表)”这样的形式运行,即把一对括号()应用到某个对象身上。

>>> def fun():

...    pass

...

>>> dir(fun)

['__annotations__', '__call__', '__class__','__closure__', '__code__', '__defaults__', '__delattr__', '__dict__','__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__','__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__','__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__','__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__','__setattr__', '__sizeof__', '__str__', '__subclasshook__']

>>> 

函数之所以可以被调用,是因为其有一个特殊的属性__call__。

>>> hasattr(fun,"__call__")

True

>>> 

       还可以使用callable函数进行验证,如

>>> callable(fun)

True

>>> 

实际上python中存在以下几种可调用对象

用户定义的函数,如使用 def 语句或 lambda 表达式创建

内置函数,使用 C 语言(CPython)实现的函数,如 len、sorted

方法,类中定义的函数

类,调用类时会运行类的 __new__方法创建一个实例,然后运行 __init__方法,初始化实例,最后把实例返回给调用方。

生成器,使用 yield 关键字的函数或方法。

而类实例对象是不可调用,无法直接使用class_instance(args_list)。但可以在类中实现一个__call__方法,使它的类实例变成可调用对象。

它的作用是让类对象生成的实例对象可以函数一样调用。它重载了()功能,当实例对象带括号()调用时,被 __call__ 这个方法钩住(所谓的钩子),也就是说实例对象带括号()调用的是__call__这个方法。如果__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

>>> p = Person('Bob','male')

>>> p()

Traceback (most recent call last):

 File "", line 1, in ?

TypeError: __call__() takesexactly 2 arguments (1 given)

>>> 

>>> p('Tim')

My name is Bob...

My friend is Tim...

>>> callable(p)

True

单看 p('Tim') 无法确定 p 是一个函数还是一个类实例。

python中的__call__允许程序员创建可调用的对象(实例),默认情况下__call__()方法是没有实现的,这意味着大多数实例是不可调用的。然而,如果在类定义中覆盖了这个方法,那么这实际上一个类实例就可以变成一个可调用对象。

相关文章

  • 小结-Python-可迭代、迭代器和生成器的区别

    可迭代对象 可迭代对象指的是定义了_ _ iter _ _ 方法的对象,调用该方法会返回一个迭代器对象。 可迭代对...

  • Kotlin 内联函数 apply、let、run、with、a

    Apply 用this代表当前引用对象; 调用其方法时,this可省略; 一定有返回值,且返回值为当前对象 对象可...

  • 7月4日 晴

    1.可扩展性表示对象是否可以扩展,可以调用Object.esExtensible判定对象是否可扩展,Object....

  • 传递消息objc_msgSend

    在OC中,如果像对象传递消息,就会调用动态绑定机制来绝对调用的方法,对象在接收消息时调用的方法则由运行期决定,也可...

  • 迭代器和生成器

    for..of 语句for..of会遍历可迭代的对象,调用对象上的Symbol.iterator方法。 下面是在数...

  • jQuery的动画和jQuery的事件

    1.jquery链式调用 jquery对象的方法会在执行完后返回这个jquery对象,所有jquery对象的方法可...

  • Python 不可变对象

    不可变对象=》可哈希 对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新...

  • Dart学习-类

    使用类成员 对象的成员包括函数和数据(分别是方法和实例变量)。当你调用一个方法时,你在一个对象上调用它:这个方法可...

  • callable 可调用对象

    有call 方法的就是可调用对象 ,并且可以传入参数可像函数一样使用 可调用对象的意义: 在普通情况下,当一个类只...

  • 对象方法和类方法

    -对象方法 +类方法 调用对象方法必须先创建对象,在通过对象来调用。 类方法不依赖对象,使用对象名直接调用。 类方...

网友评论

      本文标题:可调用对象

      本文链接:https://www.haomeiwen.com/subject/fbyrnctx.html