暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

python中的__call__()

272

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')

print(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)

输出:
2
3
4
5

 

注:这是以前我发表在其他平台的文章,最近决定以后主要在公众号更新,所以准备把之前其他平台发表的文章移到这边来,便于归档和查找。祝大家安好!

关注我,和我一起拯救吧!

👇 按下面的小咔片给作者鼓励吧,谢谢老板!!!

文章转载自PostgreSQL运维技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论