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

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__的区别

    ### 详解 Python 中 `__get__` 和 `__getattr__` 与 `__getattribute__` 的区别 在 Python 编程语言中,对象的属性访问机制是非常灵活且强大的。当我们试图通过点号(`.`)操作符去访问一个对象的属性时,Python 会...

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

    在Python中,`__getattr__` 和 `__getattribute__` 都是用来处理对象属性访问的特殊方法,但它们在何时以及如何被调用上有显著的区别。了解这些区别对于编写更灵活、更具动态特性的代码至关重要。 首先,`__getattr...

    浅谈 Python 魔法函数 __getattr__ 与 __getattribute__

    在Python编程语言中,有一些特殊的内置方法被称为“魔法函数”(Magic Methods),它们通常以两个下划线开头和结尾,例如`__getattr__`和`__getattribute__`。这两个魔法函数都涉及到对象属性的访问,但它们在处理不...

    python 常用方法

    本文将深入探讨Python中的一些核心方法,这些方法不仅有助于更好地管理类和对象的行为,还能增强代码的灵活性与扩展性。 #### 1. 对象生命周期管理 - **`__init__` 方法**:初始化方法,在创建一个新对象时自动...

    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学习--对象特殊方法列表

    9. **其他特殊方法**:如`__getattr__`(在找不到属性时调用)、`__getattribute__`(每次访问属性时调用)、`__call__`(使对象可像函数一样调用)等。 在压缩包`demo_special-method-in-class`中,可能包含了一些...

    python-3.8.0-docs-pdf-a4_Python3.8_python版本文档_python3.8文档_

    另外,`__getattr__`和`__getattribute__`方法的行为也有所调整,以提高类的灵活性。 在函数和类的定义上,Python 3.8.0允许在函数或方法定义后添加类型注解,如`def func(a: int) -> str:`,这为代码的自我文档化...

    python官方3.7.7-amd64版本exe安装包

    5. **行级执行历史**:`__getattr__`和`__getattribute__`方法现在可以查看调用堆栈,有助于调试。 6. **安全的`os.rename()`**:在某些情况下,`os.rename()`现在可以原子地替换现有文件,降低了数据丢失的风险。 ...

    python374.zip

    6. **`__getattr__`和`__getattribute__`改进**:这两个方法现在可以处理更多情况,包括未定义的属性访问,为自定义类的行为提供了更大的灵活性。 7. **行尾空白处理**:Python 3.7的标准解释器在读取源代码时,会...

    python3.6.5版本

    4. `__getattr__` 和 `__getattribute__` 方法的改进,使得动态属性访问更加灵活。 综上所述,Python 3.6.5 版本因其稳定性、性能优化以及对深度学习框架的良好支持,成为了众多开发者的选择。如果你正在进行深度...

    Python获取任意xml节点值的方法

    在Python编程中,XML是一种常用的数据交换格式,用于存储和传输结构化数据。要解析XML文档并获取其中的节点值,通常需要使用Python的内置库`xml.dom.minidom`。本文将详细介绍如何使用这个库来获取XML文档中的任意...

    python3.7

    7. **`__getattr__`和`__dir__`的改进**:对于`__getattr__`,如果找不到属性,会先调用`__getattr__`,再尝试`__getattribute__`。`__dir__`现在会包含`__getattr__`可能返回的属性名。 8. **`os.replace()`和`os....

    Python进阶(Intermediate Python) 中文PDF彩色版

    5. **元编程**:利用Python的反射特性,如`__getattr__`、`__getattribute__`等方法,可以实现动态改变对象的行为,创建更灵活的代码结构。 6. **异常处理**:Python的异常处理机制能帮助我们编写健壮的程序,通过`...

    python 3.6(32位)

    9. **新的`__getattr__`和`__getattribute__`方法**:这两个方法在处理属性访问时提供了更多灵活性,允许在对象没有特定属性时进行动态行为定义。 10. **性能提升**:Python 3.6在内部实现上进行了优化,提高了解释...

    Python-3.7.0-amd64.rar

    8. `__getattr__`和`__getattribute__`方法的改进,使得动态属性访问更加灵活和可控。 9. `os`模块新增了`os.replace()`和`os.rename()`函数,提供原子性的文件重命名操作,这对于并发环境中的文件操作至关重要。 ...

    python 3.5.2官方API

    以上只是Python 3.5.2的部分亮点,完整的官方API文档(HTML格式)会详细涵盖每个模块、函数、类和方法的用法,是学习和开发过程中不可或缺的参考资源。通过深入阅读和实践,开发者能够充分利用这些特性来编写高效、...

    Python类特性描述

    ### Python 类特性描述 ...总结来说,Python 的特殊方法极大地丰富了类的功能,并允许开发者实现更复杂的逻辑和更灵活的对象行为。了解并熟练运用这些特殊方法对于深入学习 Python 编程具有重要意义。

    Python核心编程第二版

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

Global site tag (gtag.js) - Google Analytics