object.__call__(self[, args...])

Called when the instance is “called” as a function; if this method is defined, x(arg1, arg2, ...) is a shorthand for x.__call__(arg1, arg2, ...).

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

class Student(object):
def __init__(self, name):
self.name = name
def __call__(self):
print('My name is %s.' % self.name) s = Student('Michael')
s()
# My name is Michael.

通过使用__setattr____getattr____delattr__可以重写dict,使之通过“.”调用键值。

class Dict(dict):
'''
通过使用__setattr__,__getattr__,__delattr__
可以重写dict,使之通过“.”调用
'''
def __setattr__(self, key, value):
print("In '__setattr__")
self[key] = value def __getattr__(self, key):
try:
print("In '__getattr__")
return self[key]
except KeyError as k:
return None def __delattr__(self, key):
try:
del self[key]
except KeyError as k:
return None # __call__方法用于实例自身的调用,达到()调用的效果
def __call__(self, key): # 带参数key的__call__方法
try:
print("In '__call__'")
return self[key]
except KeyError as k:
return "In '__call__' error" s = Dict()
print(s.__dict__)
# {} s.name = "hello" # 调用__setattr__
# In '__setattr__ print(s.__dict__) # 由于调用的'__setattr__', name属性没有加入实例属性字典中。
# {} print(s("name")) # 调用__call__
# In '__call__'
# hello print(s["name"]) # dict默认行为
# hello # print(s)
print(s.name) # 调用__getattr__
# In '__getattr__
# hello del s.name # 调用__delattr__
print(s("name")) # 调用__call__
# None

__call__的更多相关文章

  1. python __call__ 内置函数的使用

    对象通过提供__call__(slef, [,*args [,**kwargs]])方法可以模拟函数的行为, 如果一个对象x提供了该方法,就可以像函数一样使用它,也就是说x(arg1, arg2... ...

  2. python的一道面试题 __call__ 的使用.

    class Person: def __init__(self): self.age = 1 def __call__(self, *args, **kwargs): print 'age', sel ...

  3. python __call__内置函数

    __call__实现可以直接调用对象的作用

  4. python的高级特性3:神奇的__call__与返回函数

    __call__是一个很神奇的特性,只要某个类型中有__call__方法,,我们可以把这个类型的对象当作函数来使用. 也许说的比较抽象,举个例子就会明白. In [107]: f = abs In [ ...

  5. python特殊函数 __call__()

    __call__ 在Python中,函数其实是一个对象: >>> f = abs >>> f.__name__ 'abs' >>> f(-123) ...

  6. python __setattr__, __getattr__, __delattr__, __call__

    python __setattr__, __getattr__, __delattr__, __call__ getattr `getattr`函数属于内建函数,可以通过函数名称获取 value = ...

  7. python中的__init__ 、__new__、__call__小结

    这篇文章主要介绍了python中的__init__ .__new__.__call__小结,需要的朋友可以参考下 1.__new__(cls, *args, **kwargs)  创建对象时调用,返回 ...

  8. python __init__ __call__

    __call__ 和 __init__半毛钱的关系都没有. 后者是构造类的实例时会调用的方法,并不是构造方法. 前者是在实例上可以呼叫的方法.代码示例如下: >>> class fo ...

  9. Python中的__init__,__call__

    __init__函数 当一个类实例被创建时, __init__() 方法会自动执行,在类实例创建完毕后执行,类似构建函数.__init__() 可以被当成构建函数,不过不象其它语言中的构建函数,它并不 ...

  10. python中的__init__ 、__new__、__call__等内置函数的剖析

    1.__new__(cls, *args, **kwargs)   创建对象时调用,返回当前对象的一个实例;注意:这里的第一个参数是cls即class本身2.__init__(self, *args, ...

随机推荐

  1. 第十五节,卷积神经网络之AlexNet网络详解(五)

    原文 ImageNet Classification with Deep ConvolutionalNeural Networks 下载地址:http://papers.nips.cc/paper/4 ...

  2. HTML学习笔记Day4

    一.浮动属性 1.首先要知道,div是块级元素,在页面中独占一行,自上而下排列,也就是传说中的流: 无论多么复杂的布局,其基本出发点均是:“如何在一行显示多个div元素”: 显然标准流已经无法满足需求 ...

  3. M1-Flask-Day4

    今日内容概要: 1.git使用 2.redis基本操作 3.celery应用 4.在flask中使用celery 5.saltstack的基本使用 基础回顾: 1.关于FLASK -基本使用 路由 视 ...

  4. 机器学习-随机梯度下降(Stochastic gradient descent)

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  5. nGrinder TestRunner DNS / sun.net.spi.nameservice.NameServiceDescriptor

    s ngrinder3.3控制台验证脚本报错 http://ngrinder.642.n7.nabble.com/ngrinder3-3-td1301.html 目前发现3.3版本在控制台校验脚本报错 ...

  6. 7.Hystrix-服务熔断

    服务熔断 类似现实生活中的“保险丝“,当某个异常条件被触发,直接熔断保险丝来起到保护电路的作用, 熔断的触发条件可以依据不同的场景有所不同,比如统计一个时间窗口内失败的调用次数. 1.断路器状态机: ...

  7. Java基础高级部分(一)

    1. 集合部分 1.1 HashMap排序 package cn.Douzi.hashMap01; import java.util.ArrayList; import java.util.Colle ...

  8. 从零开始搭建高性能高可用Tomcat服务器

    目标: Tomcat+Nginx+Memcached Ubuntu 16.04 64位测试通过 动静分类.负载均衡.集群.Javolution序列化.高性能.高可用 配置环境(目前均为最新稳定版): ...

  9. 解析ArcGis的标注(二)——认识ArcGis标注标签

    该“标注”系列博文的标注引擎使用“标准标注引擎(standard label engine)”,这个概念如不知道,可不理会,ArcGis默认标注引擎就是它. 本篇的标注语句解析使用VBScript,注 ...

  10. Vuex笔记

    Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 Vuex - 状态管理器,可以管理你的数据状态(类似于 React的 Redux) 一个 Vuex 应用的核心是 store(仓库,一个 ...