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

s1

 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入门第二十五天--反射 通过字符串的形式操作对象中的成员相关推荐

  1. 【Python入门第二十五天】Python 作用域

    变量仅在创建区域内可用.这称为作用域. 局部作用域 在函数内部创建的变量属于该函数的局部作用域,并且只能在该函数内部使用. 实例 在函数内部创建的变量在该函数内部可用: def myfunc():x ...

  2. Spring入门第二十五课

    使用具名参数 直接看代码: db.properties jdbc.user=root jdbc.password=logan123 jdbc.driverClass=com.mysql.jdbc.Dr ...

  3. IntelliJ IDEA快速入门 | 第二十五篇:IntelliJ IDEA快捷键的设置

    在讲完关于IntelliJ IDEA的一些常用设置之后,接下来,我们就来讲一讲IntelliJ IDEA中快捷键的设置,而快捷键是需要在如下Keymap界面中来设置的. 作为一个程序员,应该都知道这一 ...

  4. Python Tricks(十五)—— repeat(字符串重复)

    以一定分隔符的字符串重复的实现,关键在于如何排除末尾的分隔符: def repeat(what, count, separator):return ((what + separator)*count) ...

  5. 反射 -- 通过字符串操作对象中的成员

    getattr() setattr() hasattr() delattr() class C:def __init__(self, name):self.name = namedef f(self) ...

  6. python连载第十五篇~史上最全列表知识源码+答案

    #2017-12-19 19:34:41 December Tuesday the 51 week, the 353 day #python连载第十五篇~list列表#列表定义,访问,索引,操作,切片 ...

  7. Python编程基础:第二十五节 args参数*args

    第二十五节 args参数*args 前言 实践 前言 我们目前学习到的函数的参数个数都是固定的,那么我们是否可以指定任意多个参数呢?其实是可以的,这里就用到了args参数,它可以将用户指定的任意多个参 ...

  8. python学习的第二十五天:对PDF文件的读写操作

    文章目录 python学习的第二十五天:对PDF文件的读写操作 对Excel操作的补充 python的实用方法 获取指定文件下的所有内容 shutil模块(封装了高级的文件操作函数) PDF的相关操作 ...

  9. 求二叉树高度_LeetCode刷题——第二十五天(平衡二叉树)

    这段时间跟二叉树杠上了,接下来还有许多二叉树的题目,虽然已经做了不少了,大多题目都涉及到了递归,也挺好,刚好有机会练习一下递归,但是遇到新的题目还是有点力不从心,还需要看参考答案,真希望有一天像汤神一 ...

  10. [转]周易入门三十五问答

    周易入门三十五问答 http://mt.sohu.com/20150714/n416782382.shtml 1.问:何谓<周易>? 答:<周易>是我国古代哲学.自然科学与社会 ...

最新文章

  1. 基于深度学习的图像语义分割技术概述之背景与深度网络架构
  2. oracle result_cache_max_size,oracle database 11g新特性之设置result cache-Oracle
  3. excel保存超过15位数据不变科学计数法的方法
  4. win7 无法修改 host 文件解决方案
  5. python创建矩阵_Python创建对称矩阵的方法示例【基于numpy模块】
  6. OS X 使用技巧——轻松地调整窗口大小
  7. java下拉模糊查询_select2 智能补全模糊查询select2的下拉选择框使用
  8. 爱情九十三课,指尖情话
  9. 基于深度神经网络的大规模植物分类
  10. 页面常见的布局方式(图解)
  11. 矩阵分析与应用(一)
  12. c语言 python rsa库_python如何调用libcrypto实现RSA解密?
  13. 2022-2027年中国通信光缆市场规模现状及投资规划建议报告
  14. 大事务的处理方式对比
  15. 【WPS自动签到】利用云函数实现WPS自动签到获得WPS免费会员
  16. Latex——数学符号大全
  17. java换算当地时间_Java UTC时间与本地时间互相转换
  18. java返回 0 到 50 随机整数
  19. Google天涯问答提问遭遇
  20. 服务器window如何设置防火墙开放端口

热门文章

  1. cmake 交叉编译_如何使用CMake编译RTT微内核
  2. 为多孔介质的当量直径_多孔介质中单相对流换热分析的流体渗流模式
  3. 一般家用监控多少钱_安装空调一般多少钱
  4. vscode 左侧图标_分钟将vscode撸成小霸王
  5. angularjs通信以及postmessage与iframe通信
  6. 95.Extjs 表单中自定义的验证规则 VTypes
  7. 如何使用迅雷下载电骡的资源
  8. unity3d所要知道的基础知识体系大纲,可以对照着学习
  9. 谈论高并发(三)锁的一些基本概念
  10. Matlab图形窗口大小的控制 ,plot窗口大小,figure大小,axis设置