python反射函数 python映射函数
Python自省与反射
这个也是python彪悍的特性.
成都创新互联公司是一家专注于成都网站设计、网站制作与策划设计,荥阳网站建设哪家好?成都创新互联公司做网站,专注于网站建设十余年,网设计领域的专业建站公司;建站业务涵盖:荥阳等地区。荥阳做网站价格咨询:18982081108
自省就是面向对象的语言所写的程序在运行时,所能知道对象的类型.简单一句就是运行时能够获得对象的类型.比如type(),dir(),getattr(),hasattr(),isinstance().
反射机制就是在运行时,动态的确定对象的类型,并可以通过字符串调用对象属性、方法、导入模块,是一种基于字符串的事件驱动
通过源码注释我们知道,它返回对象是否具有指定名称的属性。而且它是通过调用getattr并捕获AttributeError异常来判断的。就像上面的属性调用,我们就可以使用hasattr(a, "test")来判断,通过源码注释我们也可以思考一下,eval这种是不是也可以实现这种方法呢?
但是这种方式是有缺陷的,因为test输出了两次,因为我们调用了两次test(),这跟我们想要的效果不一样。如果用hasattr呢,这个函数就不会在判断的时候调用一次了。
有了判断属性是否存在的函数,那么就得有获取属性的函数了.
从源码注释我们就能知道获取object对象的名为name的属性,想到与object.name,如果提供了default参数,那么当属性不存在的时候,就会返回默认值。同样是上面的例子:
从例子中我们可以看出,hasattr并没有调用test函数,而且getattr获取到的是函数对象,也没有调用它,通过我们主动执行func()才执行了a.test()函数,这样相比于exec和eval就灵活了许多。
判断和获取属性有了,那么设置属性也是需要的.
python 变量能否反射?
python有个方法叫__getattribute__,可以耕具字符串来获得类,应该和反射差不多。
字符串转为变量 可以用eval,还有个 exec的函数,不知道你的适合哪种,你可以试试。
Python反射介绍
反射机制是面向对象编程语言中比较重要的功能,可以动态获取对象信息以及动态调用对象,Python作为一门动态编程语言,当然也有反射机制,本文介绍Python反射函数使用方法。
在程序运行时可以获取对象类型定义信息,例如,Python中的type(obj)将返回obj对象的类型,这种获取对象的type、attribute或者method的能力称为反射。通过反射机制,可以用来检查对象里的某个方法,或某个变量是否存在。也就是可以 通过字符串映射对象的方法或者属性 。
Python反射常用的内置函数
先创建一个类:
利用反射的能力,我们可以通过属性字典 __dict__ 来访问对象的属性:
执行输出:
接下来测试一下其他反射函数:
Out:
Out:
Out:
Out:
Out:
Out:
下面介绍两种Python反射的应用场景。
从前面举的例子中,我们了解到可以通过 字符串 来获取对象的属性( getattr() ),这是非常有用的一个功能。比如,一个类中有很多方法,它们提供不同的服务,通过输入的参数来判断执行某个方法,一般的使用如下写法:
如果函数比较少这样写没有太大问题,如果有很多,这样写就比较复杂了,需要写大量else语句,可以使用反射机制来写:
这样是不是简洁了很多,上面的例子中,通过反射,将字符串变成了函数,实现了对对象方法的动态调用。
可以通过setattr()方法进行动态属性设置,在使用scapy库构造报文时,我们需要设置某些报文字段,然而网络协议的报文字段很多,在需要设置大量字段时,一个一个的赋值就很麻烦:
可以使用setattr()方法来赋值:
--THE END--
动态加载模块,python反射机制
动态加载模块用的模块importlib 里面的import_module(“字符串模块路径”, 相对路径包名)
2.getattr(对象,“字符串属性”,默认值)
补充
任意创建一个文件夹,在里面同级创建f1-f4.py的四个文件。
内容如下:
f1.py
f2.py
f3.py
f4.py
f5.py
f4.py:通过动态导入模块,动态添加属性 删除。可以解决接口自动化中的动态传参
F5.py: 通过传参的方式,去获取类的实例方法,可以做到不知道需要哪个方法的时候,用字符串的方法去调用需要的方法。接口自动化中参数化的时候可以用到。
反射机制,当通过类名去反射得到的实例方法,需要传类名进去。通过self或者对象得到的实例方法,不需要传self或者类名。如果是实例对象或者类 去调用静态方法, 都不用给函数传self cls
Python中如果对基础类型进行反射,比如int、float
动态语言里面的eval就是干这个用的
type1="int"
type2="str"
a=eval(type1+"(2222)") 这里a就是int型的2222 相当于执行a=eval("int(2222)")
b=eval(type2+("2222")) 这里b就是string型的"2222" 相当于执行b=eval("str(2222)")
另外Python偏函数特性也比较像这个,你可以搜索下看看。
Pagel’s lambda是什么意思
Pagel’s lambda,这是函数的名字。Python 中定义函数有两种方法,一种是用常规方式 def 定义,第二种是用 lambda 定义,称为 Lambda 函数或称为匿名函数。lambda运算符或lambda函数用于在Python中创建小的一次性匿名函数对象。
使用的好处:函数没有名字,不需要命名,也不必担心函数名冲突;大量简化了代码,使代码简练清晰;作为回调函数,传递给某些应用。
Python与其他语言的区别
1、在编写代码层面来说,python是最简单的,其大量的第三方库可以让程序员省去不少事,其他语言没有python编写快主要的原因是因为其编程思想和语法规则所导致。
2、在运行速度层面来说,python是最慢的,python是解释型语言即运行时才会翻译语言,这是导致其运行效率低下的本质原因。其他语言是属于静态语言,都是直接编译成字节码文件。
3、从学习层面来说,C语言和C++的入门难度最大,java和python的入门难度稍小。
以上内容参考:百度百科——Lambda表达式
标题名称:python反射函数 python映射函数
文章分享:http://ybzwz.com/article/hiogco.html