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 lucaslucasattribute1 is indirectly called by fun()<type 'instancemethod'>attribute1 called and crown is passed in as a parameterattrribute1 is directly calledattribute1 called and tomato is passed in as a parameterProcess 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中的'非私有'方法啦。
python中的内置函数getattr()介绍及示例的更多相关文章
- python中的内置函数getattr()
在python的官方文档中:getattr()的解释如下: getattr(object, name[, default]) Return the value of the named attribu ...
- python中一些内置函数实例
lambda表达式 简单函数可用lambda表达式 1. def f1() return(123) r1=f1() print() 2. f2=lambda:123 r2=f2() print() 以 ...
- python中的内置函数(一)
内置函数:内置函数就是python提供的,可以拿来直接用的函数 作用域相关 locals():返回当前作用域中的名字globals():返回全局作用域中的内容 def func(): print('我 ...
- Python中的内置函数__init__()的理解
有点意思,本来我是学习java的.总所周知,java也有构造函数,而python在面向对象的概念中,也有构造函数.它就是 __init__(self) 方法. 其实类似于__init__()这种方法, ...
- python中的内置函数,递归,递归文件显示(二),二分法
1.部分内置函数 repr()显示出字符串的官方表示形式,返回一个对象的string形式 # repr 就是原封不动的输出, 引号和转义字符都不起作用 print(repr('大家好,\n \t我叫周 ...
- python中的内置函数(一), lambda, filter, map
https://www.processon.com/view/link/5c10da0ce4b099ae3e137bf6 1.内置函数 内置函数就是python中提供的,可以直接拿来用的函数,比如pr ...
- python中的内置函数(2)
一.lambda匿名函数定义:为了解决一些简单的需求而设计的一句话函数例子:计算n的n次方 def func(n):#正常的写法 return n**2 f=lambda n:n**2 这里的lamb ...
- 2018.8.14 python中的内置函数(68个)
主要内容: python中68个内置函数的功能及使用方法
- python学习之【第十篇】:Python中的内置函数
1.前言 内置函数,就是Python内部预先定义好的函数,可以直接使用,Python中内置函数有以下这么多个: 2.map() 描述: map() 会根据提供的函数对指定序列做映射.第一个参数 fun ...
随机推荐
- [转载]去除文件中的^M
用/bin/cat -v /etc/profile看到很多^M,是因为Windows下的换行符的原因. 现在在linux下面删了就行,我用的第一种方法. 第一种方法 (先yum install -y ...
- python两个列表合并为字典,一个作为key,一个作为value
两个列表合并为一个字典函数list_dic(list1,list2)可以直接复制拿走 传入的参数为两个列表,list1准备作为key,list2准备作为value,key和value位置一一对应. d ...
- Django web框架-----Django templates模板
说明:mytestsite是django框架下的项目,quicktool是mytestsite项目中的应用 一般的变量之类的用 {{ }}(变量),功能类的比如循环.条件判断是用 {% %}(标签) ...
- web api 安全
这方面的文章已经有很多了,我只是记录一下自己在项目中应用的具体实现 客户端 DateTime t = DateTime.Now; long timeStamp = SignHelper.Convert ...
- win2012R2 的IIS报错HTTP404,报错在计算机上找不到服务W3SVC等等
一.背景 今天远程给客户解决IIS的默认网页浏览找不到文件夹,报错HTTP404,找了很多原因,而且也报错在计算机上找不到服务W3SVC等等,如图所示: 二.原因 试了很多方法都不可以重装IIS都不行 ...
- MVC架构模式详细说明
一.简介: 架构模式是一个通用的.可重用的解决方案,用于在给定上下文中的软件体系结构中经常出现的问题.架构模式与软件设计模式类似,但具有更广泛的范围. 模型-视图-控制器模式,也称为MVC模式(Mod ...
- FPM五:拆解前面的四——OVP做查询和结果
说明:前面的例子是将list和search放到一个Feeder Class里的,这里来做拆解分步说明. 1.创建SEARCH的结构 2.创建RESULT的结构 表类型(不用表类型的话,需要自己在cla ...
- hbase-0.92.1过滤器学习
查看当前hbase中支持的过滤器 hbase(main):060:0* show_filters Documentation on filters mentioned below can be fou ...
- vue中的路由
路由配置项: import Router from ‘vue-router’ 1.path:路径 ...
- redis 持久化共享 Session
https://docs.microsoft.com/zh-cn/azure/redis-cache/cache-aspnet-session-state-provider