Python之反射
反射就是通过字符串的形式导入模块。通过字符串的形式,去模块中寻找函数去执行;利用字符串的形式去对象中操作成员,一切都是基于字符串的事件驱动。
# 反射的内置函数
# getattr
class A(object):
def __init__(self, name):
self.name = name
def method(self):
print("Your name is {}".format(self.name))
obj = A("joker")
## 如果obj里有name属性就打印self.name,反之打印not find
print(getattr(obj, "name", "not find"))
## 如果obj里有age属性就打印self.age,反之打印not find
print(getattr(obj, "age", "not find"))
## 如果是方法,就打印其地址,反之打印default
print(getattr(obj, "method", "default"))
## 如果是方法,就打印其地址,反之打印default
print(getattr(obj, "func", "default"))
----------------------------------------------------------------------
joker
not find
<bound method A.method of <__main__.A object at 0x0000018992FD20B8>>
default
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
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
# hasattr
hasattr()返回的是布尔值,判断对象、模块等中是否存在这个值;
print(hasattr(obj, "name"))
print(hasattr(obj, "age"))
print(hasattr(obj, "method"))
print(hasattr(obj, "func"))
---------------------------------------------------
True
False
True
False
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# setattr
参数是一个对象,一个字符串和一个任意值。字符串可能会列出一个现有的属性或一个新的属性。这个函数将值赋给属性的。该对象允许它提供.
## 如果对象中有name属性,则把"blala"赋值给它
print(setattr(obj, "name", "blala"))
print(getattr(obj, "name"))
----------------------------------------------
None <---- set成功会返回None
blala
## 如果对象中没有age属性,则创建一个新属性age,将12赋值给它
print(setattr(obj, "age", 12))
print(getattr(obj, "age"))
-----------------------------------------------
None
12
## 如果对象中有method方法,则重写里面的方法
print(setattr(obj, "method", print("OK")))
print(getattr(obj, "method"))
-----------------------------------------------
None
OK
## 如果对象中没有func方法,则创建一个新的方法func
print(setattr(obj, "func", print("func is OK")))
print(getattr(obj, "func"))
----------------------------------------------
None
func is OK
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
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
# delattr
删除模块或者对象中的属性或方法。删除成功会返回 None。
print(delattr(obj, "name"))
print(hasattr(obj, "name"))
--------------------------------------
None
False
## 如果不存在,就报异常
print(delattr(obj, "age"))
-------------------------------------
AttributeError: age
## 创建一个新的func
print(setattr(obj, "func", print("func is OK")))
print(delattr(obj, "func"))
print(hasattr(obj, "func"))
--------------------------------------
None <------ 添加成功返回码
func is OK
None <------ 删除成功返回码
False
## 对象中原有定义的函数是无法del的,会报异常
print(hasattr(obj, "method"))
print(delattr(obj, "method"))
--------------------------------------
True
AttributeError: method
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
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
作者:
本文链接:https://jokerbai.com
版权声明:本博客所有文章除特别声明外,均采用 署名-非商业性-相同方式共享 4.0 国际 (CC-BY-NC-SA-4.0) 许可协议。转载请注明出处!
上次更新: 2025/07/19, 11:33:23
- 02
- 使用Zadig从0到1实现持续交付平台07-19
- 03
- 基于Jira的运维发布平台07-19