__getitem__ 实例虽然能作用于for循环,看起来和list有点像,但是,把它当成list来使用还是不行,要表现得像list那样按照下标取出元素,需要实现__getitem__()方法

__getattr__ 正常情况下,当我们调用类的方法或属性时,如果不存在,就会报错。要避免这个错误,除了可以加上一个score属性外,Python还有另一个机制,那就是写一个__getattr__()方法,动态返回一个属性。修改如下:

class Student(object):

    def __init__(self):
self.name = 'Michael' def __getattr__(self, attr):
if attr=='score':
return 99

当调用不存在的属性时,比如score,Python解释器会试图调用__getattr__(self, 'score')来尝试获得属性,这样,我们就有机会返回score的值,

返回函数也是完全可以的

class Student(object):

    def __getattr__(self, attr):
if attr=='age':
return lambda: 25
>>> s.age()
25
注意,只有在没有找到属性的情况下,才调用__getattr__

__call__ 一个对象实例可以有自己的属性和方法,当我们调用实例方法时,我们用instance.method()来调用。能不能直接在实例本身上调用呢?在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() # self参数不要传入
My name is Michael.

__call__()还可以定义参数。对实例进行直接调用就好比对一个函数进行调用一样,所以你完全可以把对象看成函数,把函数看成对象,因为这两者之间本来就没啥根本的区别。

如果你把对象看成函数,那么函数本身其实也可以在运行期动态创建出来,因为类的实例都是运行期创建出来的,这么一来,我们就模糊了对象和函数的界限。

那么,怎么判断一个变量是对象还是函数呢?其实,更多的时候,我们需要判断一个对象是否能被调用,能被调用的对象就是一个Callable对象,比如函数和我们上面定义的带有__call__()的类实例:

>>> callable(Student())
True
>>> callable(max)
True
>>> callable([1, 2, 3])
False
>>> callable(None)
False
>>> callable('str')
False

通过callable()函数,我们就可以判断一个对象是否是“可调用”对象。

 

 
 



类 __getitem__ __getattr__ __call__的更多相关文章

  1. python 类中__getattr__的使用

    class F: def __init__(self, name): self.name = name def __getattr__(self, item): return '__getattr__ ...

  2. 元类编程--__getattr__, __getattribute__

    #__getattr__, __getattribute__ #__getattr__ 就是在查找不到属性的时候调用 from datetime import date class User: def ...

  3. 类中的__call__()

    class A: def __call__(self, *args, **kwargs): print('执行了call方法') def call(self): print('执行call方法') c ...

  4. Python学习笔记:基础

    本文根据廖雪峰的博客,学习整理笔记.主要内容有:基本数据类型,容器数据类型,变量及其作用域,判断及循环语法,函数式编程,面向对象,模块等概念. 数据类型 在python中,能够直接处理的数据类型有以下 ...

  5. 一篇文章让你彻底明白__getattr__、__getattribute__、__getitem__的用法与执行原理

    __getattr__ 在Python中,当我们试图访问一个不存在的属性的时候,会报出一个AttributeError.但是如何才能避免这一点呢?于是__getattr__便闪亮登场了 当访问一个不存 ...

  6. __getattr__在python2.x与python3.x中的区别及其对属性截取与代理类的影响

    python2.x中的新类型类(New-style class)与python3.x的类一致,均继承object类,而不继承object的类称为经典类(classic class),而对于这两种类,一 ...

  7. 通过 python的 __call__ 函数与元类 实现单例模式

    简单一句话,当一个类实现__call__方法时,这个类的实例就会变成可调用对象. 直接上测试代码 class ClassA: def __call__(self, *args, **kwargs): ...

  8. 【原创】Python 对象创建过程中元类, __new__, __call__, __init__ 的处理

    原始type: type是最原始的元类,其__call__方法是在你使用" t_class = type(classname_string, base_classes_tuple, attr ...

  9. python类和实例以及__call__/__del__

    面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可 ...

随机推荐

  1. Confluence 6 在升级之前

    在这个指南中,我们将会与你一同对最新的 Confluence 站点在 Windows 或者 Linux 平台进行安装和更新. 如果你的 Confluence 安装实例是当前的许可证的话,那么对 Con ...

  2. Mock.js常用占位符——Basic、Date、Color

    1. Basic 在通过占位符引用方法时, Mock.mock('@boolean')  : Mock.mock('@boolean()')  都可以调用方法 方法 含义 使用举例 Random.bo ...

  3. 人生苦短,我用python(目录)

    一.python基础篇 python中闭包及延时绑定问题 python中的装饰器.生成器 二.前端 bootstrap框架 BOM&DOM JavaScript中的词法分析 三.数据库 mys ...

  4. mac常用操作

    Command+Shift+. 可以显示隐藏文件.文件夹 touch a.txt 新建txt文件

  5. 框架-thrift-zookeeper-kafka

    Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架. 目前流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Service,基于 ...

  6. editorconfig使用

    //是否是顶级配置文件,设置为true的时候才会停止搜索.editorconfig文件 root = true [*] //缩进方式tab" | "space indent_sty ...

  7. Android 音视频深入 十八 FFmpeg播放视频,有声音(附源码下载)

    项目地址https://github.com/979451341/AudioVideoStudyCodeTwo/tree/master/FFmpegv%E6%92%AD%E6%94%BE%E8%A7% ...

  8. android控件基本布局

    <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android=&qu ...

  9. WPF拖动总结

    https://www.cnblogs.com/DebugLZQ/archive/2013/05/07/3062733.html <Window xmlns="http://schem ...

  10. react-redux-store

    store是联系state 和 reducer的部分 Store 有以下职责: 维持应用的 state: 提供 getState() 方法获取 state: 提供 dispatch(action) 方 ...