python入门第二十五天--反射 通过字符串的形式操作对象中的成员
python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。
Python getattr() 函数
Python 内置函数
描述
getattr() 函数用于返回一个对象属性值。
语法
getattr 语法:
getattr(object, name[, default])
参数
- object -- 对象。
- name -- 字符串,对象属性。
- default -- 默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError。
返回值
返回对象属性值。
1 >>>class A(object): 2 ... bar = 1 3 ... 4 >>> a = A() 5 >>> getattr(a, 'bar') # 获取属性 bar 值 6 1 7 >>> getattr(a, 'bar2') # 属性 bar2 不存在,触发异常 8 Traceback (most recent call last): 9 File "<stdin>", line 1, in <module> 10 AttributeError: 'A' object has no attribute 'bar2' 11 >>> getattr(a, 'bar2', 3) # 属性 bar2 不存在,但设置了默认值 12 3 13 >>>
getattr
Python hasattr() 函数
Python 内置函数
描述
hasattr() 函数用于判断对象是否包含对应的属性。
语法
hasattr 语法:
hasattr(object, name)
参数
- object -- 对象。
- name -- 字符串,属性名。
返回值
如果对象有该属性返回 True,否则返回 False。
实例
以下实例展示了 hasattr 的使用方法:
1 #!/usr/bin/python 2 # -*- coding: UTF-8 -*- 3 4 class Coordinate: 5 x = 10 6 y = -5 7 z = 0 8 9 point1 = Coordinate() 10 print(hasattr(point1, 'x')) 11 print(hasattr(point1, 'y')) 12 print(hasattr(point1, 'z')) 13 print(hasattr(point1, 'no')) # 没有该属性
hasattr
Python setattr() 函数
Python 内置函数
描述
setattr 函数对应函数 getatt(),用于设置属性值,该属性必须存在。
语法
setattr 语法:
setattr(object, name, value)
参数
- object -- 对象。
- name -- 字符串,对象属性。
- value -- 属性值。
返回值
无。
实例
以下实例展示了 setattr 的使用方法:
>>>class A(object): ... bar = 1 ... >>> a = A() >>> getattr(a, 'bar') # 获取属性 bar 值 1 >>> setattr(a, 'bar', 5) # 设置属性 bar 值 >>> a.bar 5
setattr
Python delattr() 函数
Python 内置函数
描述
delattr 函数用于删除属性。
delattr(x, 'foobar') 相等于 del x.foobar。
语法
setattr 语法:
delattr(object, name)
参数
- object -- 对象。
- name -- 必须是对象的属性。
返回值
无。
实例
以下实例展示了 delattr 的使用方法:
1 #!/usr/bin/python 2 # -*- coding: UTF-8 -*- 3 4 class Coordinate: 5 x = 10 6 y = -5 7 z = 0 8 9 point1 = Coordinate() 10 11 print('x = ',point1.x) 12 print('y = ',point1.y) 13 print('z = ',point1.z) 14 15 delattr(Coordinate, 'z') 16 17 print('--删除 z 属性后--') 18 print('x = ',point1.x) 19 print('y = ',point1.y) 20 21 # 触发错误 22 print('z = ',point1.z)
delattr
1 #!/usr/bin/env python3 2 #-*- coding:utf-8 -*- 3 ''' 4 Administrator 5 2018/7/26 6 ''' 7 from inspect import isfunction 8 class Foo: 9 def __init__(self,name,age): 10 self.name=name 11 self.age=age 12 def show(self): 13 print('ok') 14 return '%s----%s'%(self.name,self.age) 15 16 obj=Foo("诸葛亮",27) 17 18 # while True: 19 # b=input("请输入要查看的属性或字段:>>>") 20 # v=getattr(obj,b) 21 # print(v()) 22 # if isfunction(v): 23 # s=v() 24 # print(s) 25 # else: 26 # s=v 27 # print(s) 28 #####若只给b='name',怎么从obj中拿出对象的名字########## 29 b='name' 30 # 31 # #通过字典拿到 __dic__ 32 # # print(obj.__dict__[b]) 33 # v=getattr(obj,b) 34 # print(v) 35 36 37 # print(hasattr(obj,b)) 38 setattr(obj,"kq","钮鹏程")#放到对象的内存中 39 print(obj.kq) 40 41 delattr(obj,b) 42 print(obj.age)
反射一
导入模块
1 name="中国" 2 3 def fn(): 4 return 'ok' 5 6 class Foo: 7 def __init__(self): 8 self.name=123
s2
1 import s2 2 3 r1=s2.name 4 print(r1) 5 6 r2=s2.fn() 7 print(r2) 8 9 print(getattr(s2,'name')) 10 print(getattr(s2,'fn')()) 11 obj_cls=getattr(s2,'Foo') 12 print(obj_cls) 13 A=obj_cls() 14 print(A.name)
1 #!/usr/bin/env python3 2 #-*- coding:utf-8 -*- 3 ''' 4 Administrator 5 2018/7/26 6 ''' 7 """ 8 from inspect import isfunction 9 class Foo: 10 def __init__(self,name,age): 11 self.name=name 12 self.age=age 13 def show(self): 14 print('ok') 15 return '%s----%s'%(self.name,self.age) 16 17 obj=Foo("诸葛亮",27) 18 19 # while True: 20 # b=input("请输入要查看的属性或字段:>>>") 21 # v=getattr(obj,b) 22 # print(v()) 23 # if isfunction(v): 24 # s=v() 25 # print(s) 26 # else: 27 # s=v 28 # print(s) 29 #####若只给b='name',怎么从obj中拿出对象的名字########## 30 b='name' 31 # 32 # #通过字典拿到 __dic__ 33 # # print(obj.__dict__[b]) 34 # v=getattr(obj,b) 35 # print(v) 36 37 38 # print(hasattr(obj,b)) 39 setattr(obj,"kq","钮鹏程")#放到对象的内存中 40 print(obj.kq) 41 42 delattr(obj,b) 43 print(obj.age) 44 """ 45 import s2 46 47 r1=s2.name 48 print(r1) 49 50 r2=s2.fn() 51 print(r2) 52 53 print(getattr(s2,'name')) 54 print(getattr(s2,'fn')()) 55 obj_cls=getattr(s2,'Foo') 56 print(obj_cls) 57 A=obj_cls() 58 print(A.name)
代码草图
一、isinstance(obj, cls)
检查是否obj是否是类 cls 的对象
class Foo(object):passobj = Foo()isinstance(obj, Foo)
二、issubclass(sub, super)
检查sub类是否是 super 类的派生类
class Foo(object):passclass Bar(Foo):passissubclass(Bar, Foo)
1 #!/usr/bin/env python 2 #coding:utf-8 3 from wsgiref.simple_server import make_server 4 5 class Handler(object): 6 7 def index(self): 8 return 'index' 9 10 def news(self): 11 return 'news' 12 13 14 def RunServer(environ, start_response): 15 start_response('200 OK', [('Content-Type', 'text/html')]) 16 url = environ['PATH_INFO'] 17 temp = url.split('/')[1] 18 obj = Handler() 19 is_exist = hasattr(obj, temp) 20 if is_exist: 21 func = getattr(obj, temp) 22 ret = func() 23 return ret 24 else: 25 return '404 not found' 26 27 if __name__ == '__main__': 28 httpd = make_server('', 8001, RunServer) 29 print "Serving HTTP on port 8000..." 30 httpd.serve_forever()
Web框架实例
结论:反射是通过字符串的形式操作对象相关的成员。一切事物都是对象!!!
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 import sys 5 6 7 def s1(): 8 print 's1' 9 10 11 def s2(): 12 print 's2' 13 14 15 this_module = sys.modules[__name__] 16 17 hasattr(this_module, 's1') 18 getattr(this_module, 's2')
反射当前模块成员
类也是对象
class Foo(object):staticField = "old boy"def __init__(self):self.name = 'wupeiqi'def func(self):return 'func'@staticmethoddef bar():return 'bar'print getattr(Foo, 'staticField') print getattr(Foo, 'func') print getattr(Foo, 'bar')
模块也是对象
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 def dev(): 5 return 'dev'
s2
#!/usr/bin/env python # -*- coding:utf-8 -*-""" 程序目录:home.pyindex.py当前文件:index.py """import s2 as obj#obj.dev() func = getattr(obj, 'dev') func()
设计模式——————单例模式
1 class Foo: 2 def __init__(self,name,age): 3 self.name=name 4 self.age=age 5 def show(self): 6 print(self.name,self.age) 7 8 #obj=Foo("独孤白天",23) #obj对象,也称为类的实例(实例化) 9 #print(obj.name) 10 11 #单例模式 就是单个实例 永远使用同一个对象 12 v=None 13 while True: 14 if v: 15 v.show() 16 else: 17 v=Foo("独孤白天",23) 18 v.show()
改一下:
1 class Foo: 2 __v=None 3 4 @classmethod 5 def get_instance(cls): 6 if cls.__v: 7 return cls.__v 8 else: 9 cls.__v=Foo() 10 return cls.__v 11 12 obj=Foo.get_instance() 13 print(obj) 14 15 obj2=Foo.get_instance() 16 print(obj2) 17 18 obj3=Foo.get_instance() 19 print(obj3)
运行结果:
"D:\Program Files (x86)\python36\python.exe" F:/python从入门到放弃/7.26/单例模式.py <__main__.Foo object at 0x00000000024BD550> <__main__.Foo object at 0x00000000024BD550> <__main__.Foo object at 0x00000000024BD550>Process finished with exit code 0
1 class F1: 2 def __init__(self): 3 self.name=123 4 5 class F2: 6 def __init__(self,name): 7 self.name=name 8 9 class F3: 10 def __init__(self, name): 11 self.name = name 12 obj=F1() 13 obj2=F2(obj) 14 obj3=F3(obj2) 15 print(obj3.name.name.name)
View Code
转载于:https://www.cnblogs.com/Mengchangxin/p/9371094.html
python入门第二十五天--反射 通过字符串的形式操作对象中的成员相关推荐
- 【Python入门第二十五天】Python 作用域
变量仅在创建区域内可用.这称为作用域. 局部作用域 在函数内部创建的变量属于该函数的局部作用域,并且只能在该函数内部使用. 实例 在函数内部创建的变量在该函数内部可用: def myfunc():x ...
- Spring入门第二十五课
使用具名参数 直接看代码: db.properties jdbc.user=root jdbc.password=logan123 jdbc.driverClass=com.mysql.jdbc.Dr ...
- IntelliJ IDEA快速入门 | 第二十五篇:IntelliJ IDEA快捷键的设置
在讲完关于IntelliJ IDEA的一些常用设置之后,接下来,我们就来讲一讲IntelliJ IDEA中快捷键的设置,而快捷键是需要在如下Keymap界面中来设置的. 作为一个程序员,应该都知道这一 ...
- Python Tricks(十五)—— repeat(字符串重复)
以一定分隔符的字符串重复的实现,关键在于如何排除末尾的分隔符: def repeat(what, count, separator):return ((what + separator)*count) ...
- 反射 -- 通过字符串操作对象中的成员
getattr() setattr() hasattr() delattr() class C:def __init__(self, name):self.name = namedef f(self) ...
- python连载第十五篇~史上最全列表知识源码+答案
#2017-12-19 19:34:41 December Tuesday the 51 week, the 353 day #python连载第十五篇~list列表#列表定义,访问,索引,操作,切片 ...
- Python编程基础:第二十五节 args参数*args
第二十五节 args参数*args 前言 实践 前言 我们目前学习到的函数的参数个数都是固定的,那么我们是否可以指定任意多个参数呢?其实是可以的,这里就用到了args参数,它可以将用户指定的任意多个参 ...
- python学习的第二十五天:对PDF文件的读写操作
文章目录 python学习的第二十五天:对PDF文件的读写操作 对Excel操作的补充 python的实用方法 获取指定文件下的所有内容 shutil模块(封装了高级的文件操作函数) PDF的相关操作 ...
- 求二叉树高度_LeetCode刷题——第二十五天(平衡二叉树)
这段时间跟二叉树杠上了,接下来还有许多二叉树的题目,虽然已经做了不少了,大多题目都涉及到了递归,也挺好,刚好有机会练习一下递归,但是遇到新的题目还是有点力不从心,还需要看参考答案,真希望有一天像汤神一 ...
- [转]周易入门三十五问答
周易入门三十五问答 http://mt.sohu.com/20150714/n416782382.shtml 1.问:何谓<周易>? 答:<周易>是我国古代哲学.自然科学与社会 ...
最新文章
- 基于深度学习的图像语义分割技术概述之背景与深度网络架构
- oracle result_cache_max_size,oracle database 11g新特性之设置result cache-Oracle
- excel保存超过15位数据不变科学计数法的方法
- win7 无法修改 host 文件解决方案
- python创建矩阵_Python创建对称矩阵的方法示例【基于numpy模块】
- OS X 使用技巧——轻松地调整窗口大小
- java下拉模糊查询_select2 智能补全模糊查询select2的下拉选择框使用
- 爱情九十三课,指尖情话
- 基于深度神经网络的大规模植物分类
- 页面常见的布局方式(图解)
- 矩阵分析与应用(一)
- c语言 python rsa库_python如何调用libcrypto实现RSA解密?
- 2022-2027年中国通信光缆市场规模现状及投资规划建议报告
- 大事务的处理方式对比
- 【WPS自动签到】利用云函数实现WPS自动签到获得WPS免费会员
- Latex——数学符号大全
- java换算当地时间_Java UTC时间与本地时间互相转换
- java返回 0 到 50 随机整数
- Google天涯问答提问遭遇
- 服务器window如何设置防火墙开放端口
热门文章
- cmake 交叉编译_如何使用CMake编译RTT微内核
- 为多孔介质的当量直径_多孔介质中单相对流换热分析的流体渗流模式
- 一般家用监控多少钱_安装空调一般多少钱
- vscode 左侧图标_分钟将vscode撸成小霸王
- angularjs通信以及postmessage与iframe通信
- 95.Extjs 表单中自定义的验证规则 VTypes
- 如何使用迅雷下载电骡的资源
- unity3d所要知道的基础知识体系大纲,可以对照着学习
- 谈论高并发(三)锁的一些基本概念
- Matlab图形窗口大小的控制 ,plot窗口大小,figure大小,axis设置