Python 反射机制之hasattr()、getattr()、setattr() 、delattr()函数
反射机制
先看看我对Java中反射机制的通俗理解:反射之中包含了一个“反”的概念,所以要想解释反射就必须先从“正”开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化对象,但是“反”指的是通过对象找到类。
而对于Python,如果我们需要动态导入模块,并且动态地访问对象中的属性和方法,怎么做?请看下面的代码。
s = "lib.test.commons"
m1 = __import__(s) # 这样仅仅动态导入了lib模块
m2 = __import__(s, fromlist = True) # fromlist = True,这样才能按路径动态导入commons模块 inp_func = input("请输入要执行的函数:")
f = getattr(m2, inp_func)() # 加"()"动态执行函数
由上述可见,反射就是:
- 通过字符串的形式,动态导入模块;
- 利用字符串的形式,在对象(模块)中操作(查找/获取/删除/添加)成员,是一种基于字符串的事件驱动!
反射机制内置函数
hasattr(obj,name)
判断一个对象obj里面是否有name属性或者name方法,返回bool值,有name特性返回True, 否则返回False。
需要注意的是name要用引号包起来。
class test():
name="xiaohua"
def run(self):
return "HelloWord" >>> t=test()
>>> hasattr(t, "name") #判断对象有name属性
True >>> hasattr(t, "run") #判断对象有run方法
True
getattr(obj,name[,default])
获取对象obj的属性或者方法,如果存在就打印出来,如果不存在,则打印出默认值,默认值可选。
需要注意的是,如果是返回的对象的方法,返回的是方法的内存地址,如果需要运行这个方法,可以在后面添加一对括号。
class test():
name="xiaohua"
def run(self):
return "HelloWord" >>> t=test()
>>> getattr(t, "name") #获取name属性,存在就打印出来。
'xiaohua' >>> getattr(t, "run") #获取run方法,存在就打印出方法的内存地址。
<bound method test.run of <__main__.test instance at 0x0269C878>> >>> getattr(t, "run")() #获取run方法,后面加"()"可以将这个方法运行。
'HelloWord' >>> getattr(t, "age") #获取一个不存在的属性。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: test instance has no attribute 'age' >>> getattr(t, "age","") #若属性不存在,返回一个默认值。
''
setattr(obj,name,values)
给对象obj的属性赋值,若属性不存在,先创建再赋值。
class test():
name="xiaohua"
def run(self):
return "HelloWord" >>> t=test()
>>> hasattr(t, "age") #判断属性是否存在
False >>> setattr(t, "age", "") #属性不存在就创建之,且赋值,但没有返回值 >>> hasattr(t, "age") #属性存在了
True
delattr(obj,name)
删除对象属性。
另外,eval()和exec()函数也是反射函数。
至此,转载请注明出处。

Python 反射机制之hasattr()、getattr()、setattr() 、delattr()函数的更多相关文章
- python 内置函数的补充 isinstance,issubclass, hasattr ,getattr, setattr, delattr,str,del 用法,以及元类
isinstance 是 python中的内置函数 , isinstance()用来判断一个函数是不是一个类型 issubclass 是python 中的内置函数, 用来一个类A是不是另外一个 ...
- isinstance/type/issubclass的用法,反射(hasattr,getattr,setattr,delattr)
6.23 自我总结 面向对象的高阶 1.isinstance/type/issubclass 1.type 显示对象的类,但是不会显示他的父类 2.isinstance 会显示的对象的类,也会去找对象 ...
- python反射hasattr getattr setattr delattr
反射 : 是用字符串类型的名字 去操作 变量 相比于用eval('print(name)') 留有 安全隐患 反射 就没有安全问题 hasattr 语法: hasattr(object, name)o ...
- Python hasattr,getattr,setattr,delattr
#!/usr/bin/env python # -*- coding:utf-8 -*- # 作者:Presley # 邮箱:1209989516@qq.com # 时间:2018-11-04 # 反 ...
- 反射hasattr; getattr; setattr; delattr
hasattr(obj,name_str):#判断一个对象obj里面是否有对应的name_str字符串的方法,返回True或者Falsegetattr(obj,name_str):#根据字符串去获取对 ...
- hasattr getattr setattr delattr --> (反射)
class Room: def __init__(self,name): self.name = name def big_room(self): print('bigroot') R = Room( ...
- python动态函数hasattr,getattr,setattr,delattr
hasattr(object,name) hasattr用来判断对象中是否有name属性或者name方法,如果有,染回true,否则返回false class attr(): def fun( ...
- Python的getattr(),setattr(),delattr(),hasattr()及类内建__getattr__应用
@Python的getattr(),setattr(),delattr(),hasattr() 先转一篇博文,参考.最后再给出一个例子 getattr()函数是Python自省的核心函数,具体使用大体 ...
- 反射之hasattr() getattr() setattr() 函数
Python的hasattr() getattr() setattr() 函数使用方法详解 hasattr(object, name)判断object中有没有一个name字符串对应的方法或属性,返回B ...
随机推荐
- mysql 开发进阶篇系列 18 MySQL Server(innodb_buffer_pool_size)
从这篇开始,讲innodb存储引擎中,对于几个重要的服务器参数配置.这些参数以innodb_xx 开头. 1. innodb_buffer_pool_size的设置 这个参数定义了innodb存储引擎 ...
- CentOS5/6/7系统下搭建安装Amabari大数据集群时出现SSLError: Failed to connect. Please check openssl library versions.错误的解决办法(图文详解)
不多说,直接上干货! ========================== Creating target directory... ========================== Comman ...
- Mysql 锁和锁算法
相关命令: show engines; 查看数据库支持的引擎 show variables like '%storage_engine%'; 查看数据库默认的引擎 select @@global ...
- leetcode — plus-one
import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Source : https://o ...
- ES6躬行记(10)——正则表达式
在ES5中,如果使用构造函数RegExp()初始化RegExp对象(即正则表达式),并且它的第一个参数是正则表达式时,那么不允许再传入标志字符串(即第二个参数).而ES6更改了这项限制,如果传入了第二 ...
- systemctl enable docker.service
[root@dingyingsi ~]# systemctl start docker.service [root@dingyingsi ~]# systemctl enable docker.ser ...
- Angular2入门:TypeScript的模块
一.export 二.import 三.模块的默认导出
- Python 的反射机制
什么叫做反射 利用字符串的形式去对象(模块)中操作(查找/添加/获取/删除)成员,一种基于字符串的事件驱动. 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型.然后,可以 ...
- Spring Boot入门(12)实现页面访问量统计功能
在日常的网站使用中,经常会碰到页面的访问量(或者访问者人数)统计.那么,在Spring Boot中该如何实现这个功能呢? 我们的想法是比较简单的,那就是将访问量储存在某个地方,要用的时候取出来 ...
- npm install -g @angular/cli@latest 失败
一开始的ERROR信息是 error "@angular/compiler-cli" package was not properly installed 尝试方案二时又出现了以下 ...