`
san_yun
  • 浏览: 2590894 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

python 的getattribute和getattr方法

 
阅读更多
__getattr__
当没有属性时被触发,hession-py使用__getattr__来发送命令。

class Obj(object):
    photo = "hello"
    def __getattr__(self, name):
        print name
        return _Method(self.__invoke, name)

    def __invoke(self, method, params):
        print 'invoke'

class _Method:
    def __init__(self, invoker, method):
          self._invoker = invoker
          self._method = method

    def __call__(self, *args):
         return self._invoker(self._method, args)

o = Obj()
o.hello
o.hello()

但如果属性存在就不会触发此方法,比如o.photo。这时候可以通过__getattribute__来实现:
class Obj(object):
    photo = "hello"
    def __getattribute__(self, name):
        print '1'+name
        #return _Method(self.__invoke, name)
        return object.__getattribute__(self, name)

    def __invoke(self, method, params):
        print 'invoke'

class _Method:
    def __init__(self, invoker, method):
          self._invoker = invoker
          self._method = method

    def __call__(self, *args):
         return self._invoker(self._method, args)

o = Obj()
o.photo


全部代码:
class Obj(object):
    photo = "hello"
    def __getattribute__(self, name):
        print '1'+name
        #return _Method(self.__invoke, name)
        return object.__getattribute__(self, name)

    def __getattr__(self, name):
        print '2'+name
        return _Method(self.__invoke, name)

    def __invoke(self, method, params):
        print 'invoke'

class _Method:
    def __init__(self, invoker, method):
          self._invoker = invoker
          self._method = method

    def __call__(self, *args):
         return self._invoker(self._method, args)

o = Obj()
print o.photo


参考:
http://docs.python.org/reference/datamodel.html
http://stackoverflow.com/questions/371753/python-using-getattribute-method
http://stackoverflow.com/questions/3278077/difference-between-getattr-vs-getattribute-in-python
分享到:
评论

相关推荐

    详解Python中 __get__和__getattr__和__getattribute__的区别

    __get__、__getattr__、__getattribute都是访问属性的方法,但作用不太相同,这里我们就来详解Python中 __get__和__getattr__和__getattribute__的区别:

    浅谈python中的getattr函数 hasattr函数

    下面小编就为大家带来一篇浅谈python中的getattr函数 hasattr函数。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    对比Python中__getattr__和 __getattribute__获取属性的用法

    主要介绍了对比Python中__getattr__和 __getattribute__获取属性的用法,注意二者间的区别,__getattr__只作用于不存在的属性,需要的朋友可以参考下

    浅谈 Python 魔法函数 __getattr__ 与 __getattribute__

    魔法函数 getattr 与 getattribute 简单说明 __getattr__ 与 __getattribute__ 魔法函数的使用 目录魔法函数 __getattr__ 与 __getattribute____getattr__魔法函数作用__getattribute__魔法函数总结 书上说,天下...

    Python __getattr__与__setattr__使用方法

    class Book(object): def __setattr__(self, name, value): if name == ‘value’: object.__setattr__(self, name, value – 100) else: object.__setattr__(self, name, value) def __getattr__(self, name)...

    Python核心编程第二版

     1.4 下载和安装Python   1.5 运行Python   1.5.1 命令行上的交互式解释器   1.5.2 从命令行启动脚本   1.5.3 集成开发环境   1.5.4 其他的集成开发环境和执行环境   1.6 Python文档   1.7 ...

    Python核心编程(第二版).pdf (压缩包分2部分,第二部分)

     1.4 下载和安装python   1.5 运行python   1.5.1 命令行上的交互式解释器  . 1.5.2 从命令行启动脚本   1.5.3 集成开发环境   1.5.4 其他的集成开发环境和执行环境   1.6 python文档   1.7...

    Python核心编程(第二版).pdf (压缩包分2部分,第一部分)

     1.4 下载和安装python   1.5 运行python   1.5.1 命令行上的交互式解释器  . 1.5.2 从命令行启动脚本   1.5.3 集成开发环境   1.5.4 其他的集成开发环境和执行环境   1.6 python文档   1.7...

    Python面向对象魔法方法和单例模块代码实例

    魔法方法 ​ 凡是在类内部定义,以“__开头__... __getattribute__:会在对象.属性时触发,不管有没有该属性都会触发; __setattr__: 会在 “对象.属性 = 属性值” 时触发。即:设置(添加/修改)属性会触发它的执行;

    Python黑魔法之描述符

    本文我将讲述描述符的定义以及一些常见的场景,并且在文末会补充一下__getattr,__getattribute__,__getitem__这三个同样涉及到属性访问的魔术方法。只要一个objectattribute(对象属性)定义了上面三个方法中的任意一...

    Python中几种属性访问的区别与用法详解

    python的提供一系列和属性访问有关的特殊方法: __get__ , __getattr__ , __getattribute__ , __getitem__ 。本文阐述它们的区别和用法。 属性的访问机制 一般情况下,属性访问的默认行为是从对象的字典中获取,并...

Global site tag (gtag.js) - Google Analytics