python中的内置函数getattr()介绍及示例

在python的官方文档中:getattr()的解释如下:

?


1

2

3

getattr(object, name[, default])

Return the value of the named attribute of object. name must be a string. If the string is the name of one of the object‘s attributes, the result is the value of that attribute. For example, getattr(x, ‘foobar‘) is equivalent to x.foobar. If the named attribute does not exist, default is returned if provided, otherwise AttributeError is raised.

根据属性名称返回对象值。如果“name”是对对象属性的名称,则返回对应属性的值。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

‘# -*- coding: utf-8 -*-‘

__author__ = ‘lucas‘

class attrtest(object):

  def __init__(self):

    pass

  def trygetattr0(self):

    self.name = ‘lucas‘

    print self.name

    #equals to self.name

    print getattr(self,‘name‘)

  def attribute1(self,para1):

    print ‘attribute1 called and ‘+ para1+‘ is passed in as a parameter‘

  def trygetattr(self):

    fun = getattr(self,‘attribute1‘)

    print type(fun)

    fun(‘crown‘)

if __name__==‘__main__‘:

  test = attrtest()

  print ‘getattr(self,\‘name\‘) equals to self.name ‘

  test.trygetattr0()

  print ‘attribute1 is indirectly called by fun()‘

  test.trygetattr()

  print ‘attrribute1 is directly called‘

  test.attribute1(‘tomato‘)

这段代码执行的结果是:

?


1

2

3

4

5

6

7

8

9

10

getattr(self,‘name‘) equals to self.name

lucas

lucas

attribute1 is indirectly called by fun()

<type ‘instancemethod‘>

attribute1 called and crown is passed in as a parameter

attrribute1 is directly called

attribute1 called and tomato is passed in as a parameter

Process finished with exit code 0

第一个函数tryattribute0()非常好理解,就如同定义里说的一样。第二个函数tryattribute1()就有一点费解了。其实原理并不复杂,我们看到fun的type是 instancemethod,这里你可以认为:对于函数,getattr()的返回值是一个指针,指针赋值给接受它的变量,以后call这个变量就等于调用变量指向的函数。

原理我们知道了,那getattr的作用是什么呢?

你熟悉java或者c#中的反射么?反射的一个重要作用就是延迟加载,这样可以解耦,这样可以让系统运行的更有效率。作为动态语言,python显然在这方面要更加强大,

getattr()就是实现python反射的一块积木,结合其它方法如setattr(),dir() 等,我们可以做出很多有趣的事情。

我们看以下场景:

1.我需要在一个类中动态添加其它类中有的方法:

?


1

2

3

4

5

6

7

#如果类A中有如下方法:

def addnewattributesfromotherclass(self,class_name):

    func_names = dir(class_name)

    for func_name in func_names:

      if not func_name.startswith(‘_‘):

        new_func = getattr(class_name,func_name)

        self.__setattr__(func_name,new_func())

我们只需要:

?


1

2

3

4

5

a = A()

b = B()

a.addnewattributesfromotherclass(b)

这样a就可以调用B中的‘非私有‘方法啦。

时间: 2024-10-09 00:32:29

python中的内置函数getattr()介绍及示例的相关文章

python中的内置函数getattr()

在python的官方文档中:getattr()的解释如下: getattr(object, name[, default]) Return the value of the named attribute of object. name must be a string. If the string is the name of one of the object’s attributes, the result is the value of that attribute. For examp

Python中常用内置函数介绍(filter,map,reduce,apply,zip)

Python是一门很简洁,很优雅的语言,其很多内置函数结合起来使用,可以使用很少的代码来实现很多复杂的功能,如果同样的功能要让C/C++/Java来实现的话,可能会头大,其实Python是将复杂的数据结构隐藏在内置函数中,只要写出自己的业务逻辑Python会自动得出你想要的结果.这方面的内置函数主要有,filter,map,reduce,apply,结合匿名函数,列表解析一起使用,功能更加强大.使用内置函数最显而易见的好处是: 1. 速度快,使用内置函数,比普通的PYTHON实现,速度要快一倍左

Python中的内置函数__init__()的理解

有点意思,本来我是学习java的.总所周知,java也有构造函数,而python在面向对象的概念中,也有构造函数.它就是 __init__(self) 方法. 其实类似于__init__()这种方法,其实还有很多.类似__del__(self)  ...  __new__(cls,*args,**kwd) 等等.它们被成为 python的常用内置方法. 下面开始介绍一下我对 __init__()的理解: class A(object): def __init__(self,name):  sel

Python中max()内置函数使用(list)

在学习完列表和元组的基础知识后,做到一个题: 求出列表中频次出现最多的元素. 学习到了python内置函数max的用法 其参数key的用法 匿名函数lamda的用法 python内置函数max() max()方法返回给定参数的最大值,参数值可为序列. 1 print ("max(80, 100, 1000) : ", max(80, 100, 1000)) 2 print ("max(-20, 100, 400) : ", max(-20, 100, 400)) 3

python中的内置函数(bytearray)

返回一个新的字节数组.bytearray类是range 0 < = x < 256的一个可变序列.它有大多数可变序列的常用方法,在可变序列类型中描述,以及大多数字节类型的方法,参见字节和Bytearray操作. 可选的源参数可以用几种不同的方式来初始化数组: 如果它是一个字符串,那么您还必须给出编码(以及可选的错误)参数;bytearray()然后使用str.encode()将字符串转换为字节. 如果它是一个整数,那么数组将具有这个大小,并将用null字节初始化. 如果它是符合缓冲区接口的对象

python 中的内置函数

1.输出函数 print() 1 print("hello world!") 2.输入函数 input() 1 a = input() 2 hello world 3 print (a) 3.chr()函数 该函数返回整形参数值所对应的Unicode字符的字符串 1 print(chr(916)) 2 print([chr(i) for i in range(870,8719)]) 4.ord()函数 返回单个字符的ASCⅡ值或者unicode 的值 1 print((功)) 2 pr

python中常用内置函数用法总结

强制类型转换:int()float()str()list()tuple()set()dict()总结,这几种类型转换函数得用法基本一致,基本就是int(要转换得数据).返回值类型为对应得数据类型 max():求多个参数的最大值,或可迭代对象中的最大元素min():最小值sum():求和,可迭代对象元素求和pow():求幂,pow(2, 3)等价于2 ** 3round():四舍五入,可以指定保留位数 hex():16进制oct():8进制bin():2进制 print:打印,输出input:输入

python中的内置函数

abs(number):取绝对值 1 re=abs(-342) 2 print(re) 3 #输出:342 all(iterable):判断可迭代的对象的元素是否都是真,如果是返回True 否则返回false ; 0,none,空 都是假 li=[12,43,23,] re=all(li) print(re) #输出:True li=[12,43,23,0] re=all(li) print(re) #输出:False bin(number):将number转换成二进制的数并返回 re=bin(

python中的内置函数枚举、zip

li = ['a','b','c']#print(enumerate(li)) # 枚举,步长默认从0开始,可以指定步长for id,i in enumerate(li,1): print("%s---->%s"%(id,i)) 打印: 1---->a2---->b3---->c li = ['小明','小黑','小bai']l2=[110,90,120]res=list(zip(li,l2)) # 把两个list压缩,一一对应print(res) # [('小