在看python核心编程时,看到了getattr()内建函数和__getattr__,但不太理解,就仔细的看了下并查阅了一些资料,大致了解了它们是做什么的。

getattr()
先在python解释器看下getattr()的帮助 :
Help on built-in function getattr in module __builtin__:

getattr(...)
    getattr(object, name[, default]) -> value
    
    Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
    When a default argument is given, it is returned when the attribute doesn't
    exist; without it, an exception is raised in that case.
(END)

getattr(),顾名思义就是获取对象的属性,getattr(x, 'y')等价于 x.y。 第三个参数可有可无,当给getattr()第三个参数时,如果对应的属性不存在,它会作为返回值返回。
看下面代码:
class Test(object):
     val = 1
 
>>> Test.val
1
>>> getattr(Test, 'val')
1
>>> getattr(Test, 'va', 5)
5

因为val是Test的属性,所以通过getattr可以获取到val的值,而va则不是Test的属性,但我们传进了第三个参数5,所以返回5。
使用 内建函数dir()可以查看一个对象的属性,如下
>>> dir(Test)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'val']

再看看下面的例子:
dir1 = {}
dir1['a'] = 1
dir2['b'] = 2
>>> getattr(dir1, 'a')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>

AttributeError: 'dict' object has no attribute 'a'

但为什么通过getattr获取不了dir1['a']的值呢?根据解释器的错误信息就可以看出dir1没有名为‘a'的属性。

再使用dir(dir1)来看下

>>> dir(dir1)

['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values', 'viewitems', 'viewkeys', 'viewvalues']

dir1的确没有'a'这个属性,但是有__str__这个属性

>>> getattr(dir1, '__str__')()
"{'a': 1, 'b': 2}"
>>> dir1.__str__()
"{'a': 1, 'b': 2}"

在调用getattr(obj,name)时,如果实例obj没有name属性,则会去调用类中的__getattr__

__getattr__
__getattr__()是仅当属性不能在实例的__dict__或它的类(类的__dict__),或父类的__dict__中找到时,才被调用。一般在代码中包含一个对getattr()內建函数的调用

每一个类都会用一个字典,把它包含的属性放到自己的字典里。

>>> Test.__dict__

dict_proxy({'__dict__': <attribute '__dict__' of 'Test' objects>, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'Test' objects>, '__doc__': None, 'val': 1})

看下面的示例代码
#!/usr/bin/env python

class Test1(object):

def __init__(self, obj):
        print "In __init__"
        self.data = obj

def __str__(self):
        print "In __str__"
        return str(self.data)

__repr__ = __str__

def get_attr(self):
        print "In getattr"
        return self.data

def __getattr__(self, attr):
        print "In __getattr__"
        return getattr(self.data, attr)

if __name__ == '__main__':
    myString = Test1('hello')
    print myString
    print myString.upper()
    print myString.get_attr()

看下输出结果
cullen@cullen--machine:~/python$ ./getattr.py 
In __init__
In __str__
hello
In __getattr__
HELLO
In getattr
hello

下面对结果进行简要的分析
myString = Test1('hello')
//输出结果In __init__, 不用解释了吧
print myString
//输出结果
//In __str__
//hello
print myString.upper()
//输出结果
//In __getattr__
//HELLO
重点就在这里,我们的实例myString并没有upper()这个属性,所以myString.upper()等价于getattr(myString.data, upper)()
print myString.get_attr()
//输出结果,因为gets_attr()是myString的属性,所以没有调用__getattr__。
//In getattr
//hello

Python中的getattr()和__getattr__方法相关推荐

  1. Python中的getattr、__getattr__、__getattribute__、__get__

    getattr getattr(object, name[, default])是Python的内置函数之一,它的作用是获取对象的属性. 示例 >>> class Foo: ... ...

  2. python getattr调用自己模块_在Python中通过getattr获取对象引用的方法

    getattr函数 (1)使用 getattr 函数,可以得到一个直到运行时才知道名称的函数的引用. >>> li = ["Larry", "Curly ...

  3. Python中的静态类变量和方法

    问: 如何在 Python 中创建静态类变量或方法? 答1: huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效. 在类定义内但不在方法内声明的变量是 ...

  4. python hasattr函数_浅谈python中的getattr函数 hasattr函数

    hasattr(object, name) 作用:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(ojbect, name)是否抛出异常来实现的). 示例: & ...

  5. 在Python中连接字符串的首选方法是什么?

    本文翻译自:Which is the preferred way to concatenate a string in Python? Since Python's string can't be c ...

  6. 关于python中requests模块导入问题-python中requests模块的使用方法

    本文实例讲述了python中requests模块的使用方法.分享给大家供大家参考.具体分析如下: 在HTTP相关处理中使用python是不必要的麻烦,这包括urllib2模块以巨大的复杂性代价获取综合 ...

  7. python弹出警告框_selenium+webdriver+python 中警告框的处理方法

    在自动化测试过程中,经常会遇到弹出警告框的情况,如图所示: 在 WebDriver 中处理 JavaScript 所生成的 alert.confirm 以及 prompt 是很简单的.具体做法是使用 ...

  8. 在Python中操作文件之truncate()方法的使用教程

    在Python中操作文件之truncate()方法的使用教程 这篇文章主要介绍了在Python中操作文件之truncate()方法的使用教程,是Python入门学习中的基础知识,需要的朋友可以参考下 ...

  9. python中seek函数的用法_在Python中操作文件之seek()方法的使用教程

    seek()方法在偏移设定该文件的当前位置.参数是可选的,默认为0,这意味着绝对的文件定位,它的值如果是1,这意味着寻求相对于当前位置,2表示相对于文件的末尾. 没有返回值.需要注意的是,如果该文件被 ...

最新文章

  1. 【转】[你必须知道的.NET]第二十一回:认识全面的null
  2. excel下划线转驼峰公式
  3. Linux下如何发现内存泄漏问题(测试角度)
  4. excel if in函数_Office教程:Excel函数AVERAGE与IF函数的组合标记平均值
  5. Delphi 使用 Visual Studio Shell , 开源为期不远
  6. mysql导入报错 [Err] 1273 – Unknown collation: ‘utf8mb4_0900_ai_ci’
  7. 在python3.5中使用pip
  8. Atitit Spring事务配置不起作用可能出现的问题: .是否是数据库引擎设置不对造成的【笔者就遇到了这个问题,由于笔者使用的是mysql数据,但是在创建表的时候引擎默认(mysql中引擎默认为
  9. symantec backup exec 2010 oracle 12,Symantec Backup Exec 2010在Windows平台下Oracle备份详细配置步骤...
  10. 数据结构作业总结_三种迷宫生成算法+三种走迷宫算法+pyqt5可视化(1)
  11. mysql表设计ppt_PPT表格太丑?这3个设计细节,你一定要收藏!
  12. word只在第一页插入页眉
  13. 通过c语言求得一个英文句子中的单词数量
  14. 近期一些我寨采用的新芯片资料汇总(更新Rk3066)
  15. com.google.inject.ProvisionException: Guice provision errors问题解决
  16. shell脚本:exit和return
  17. C语言__bitwise宏定义
  18. 手机163邮箱怎么登录?163手机邮箱登录页面是?
  19. 互斥事件 独立事件 两两独立 相互独立 的理解
  20. 傻傻分不清楚?带你了解设备id

热门文章

  1. cmnet 和 cmwap 收费等区别
  2. 小米4C 安装Xposed框架失败解决方案
  3. Java中类名虽然可以直接使用静态属性但是在使用时要注意静态属性是一个常量
  4. 全世界的程序员,我只服女程序员
  5. docker镜像备份和恢复
  6. mpvue——基于vue的小程序开发框架
  7. 使用barrier共享键鼠
  8. Unity3d 接入VKSDK登陆和分享 IOS篇
  9. 【STM32】STM32之SWD
  10. 反激 (Flyback) 控制器 -- LTC3803