zoukankan      html  css  js  c++  java
  • python中的 __call__()

    python中一切皆对象,函数也是对象,同时也是可调用对象(callable)。

    关于可调用对象,我们平时自定义的函数、内置函数和类都属于可调用对象,但凡是可以把一对括号()应用到某个对象身上都可称之为可调用对象,判断对象是否为可调用对象可以用函数 callable
     
    一个类实例要变成一个可调用对象,只需要实现一个特殊方法__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('Tom','male')

    p('Tony')

    callable(p)

    My name is Tom...
    My friend is Tony...
    True

     

    允许一个类的实例像函数一样被调用。实质上说,这意味着 x() 与 x.__call__() 是相同的。注意 __call__ 参数可变。这意味着你可以定义 __call__ 为其他你想要的函数,无论有多少个参数。

    __call__ 在那些类的实例经常改变状态的时候会非常有效。调用这个实例是一种改变这个对象状态的直接和优雅的做法。

    如:

    class Entity:
        def __init__(self, size, x, y):
            self.x, self.y = x, y
            self.size = size

        def __call__(self, x, y):
            '''改变实体的位置'''
            self.x, self.y = x, y


    e = Entity(1, 2, 3)
    print(e.x)
    print(e.y)

    e(4, 5)
    print(e.x)
    print(e.y)

  • 相关阅读:
    Ynoi2016 这是我自己的发明
    Luogu P5268 [SNOI2017]一个简单的询问
    Ynoi2017 由乃的玉米田
    BZOJ4320 [Shanghai2006]Homework
    JOISC2014C 歴史の研究
    莫队
    LOJ6119 「2017 山东二轮集训 Day7」国王
    Luogu P3295 [SCOI2016]萌萌哒
    10.1 进程间通信--消息队列
    9.2 网络协议理论
  • 原文地址:https://www.cnblogs.com/fat-girl-spring/p/15354007.html
Copyright © 2011-2022 走看看