31.Python之路 - 反射

Python之路 - 反射

介绍

反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力

Python面向对象中的反射是通过字符串的形式来操作对象相关的属性 , 在Python中一切皆对象 , 并且只要是对象就可以使用反射

hasattr 🍀

判断对象中是否具有给定名称的属性

1
2
3
4
5
6
def hasattr(*args, **kwargs): # real signature unknown
"""
Return whether the object has an attribute with the given name.
This is done by calling getattr(obj, name) and catching AttributeError.
"""
pass

实例1

1
2
3
4
5
6
7
8
9
10
# 定义一个字符串
name = 'lyon'
# 查看是否具有给定名称的属性
bool = hasattr(name,'__len__')
# 打印bool
print(bool)
# 执行结果:True
'''
说明:很多初学者可能一直不理解为什么说Python里一切皆对象,因为没有意识到,在Python中str、list、int ...等这些数据类型,其实就是用class写出来的一个模型,那么既然是类就会有属性这一说,就可以利用反射来操作对象了
'''

实例2

1
2
3
4
5
6
7
8
import sys
def s1():
pass
def s2():
pass
this_modules = sys.modules[__name__]
print(type(this_modules),hasattr(this_modules,'s1'))
module1

getattr 🍀

从一个对象中获取属性名称

1
2
3
4
5
6
7
def getattr(object, name, default=None): # known special case of getattr
"""
Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
When a default argument is given, it is returned when the attribute doesn't
exist; without it, an exception is raised in that case.
"""
pass

实例

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
class A:
def __init__(self,name,age):
self.name = name
self.age = age
def hello(self):
print('hello {}'.format(self.name))
# 创建一个实例a
a = A('Lyon',18)
# 获取静态属性age
age = getattr(a,'age')
# 打印age
print(age)
# 获取动态属性hello,即方法
hello = getattr(a,'hello')
# 执行hello
hello()
# 如果不存在就需要设置default参数,否则就报错
birthday = getattr(a,'birthday','today')
# 打印birthday,即为default参数
print(birthday)
'''
执行结果:
18
hello Lyon
today
'''

setattr 🍀

定义属性

1
2
3
4
5
6
def setattr(x, y, v): # real signature unknown; restored from __doc__
"""
Sets the named attribute on the given object to the specified value.
setattr(x, 'y', v) is equivalent to ``x.y = v''
"""
pass

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class B:
def __init__(self):
pass
b = B()
# 新增属性,如果存在即为修改
setattr(b, 'age', 18)
# 打印age属性
print(b.age)
# 新增add方法
setattr(b, 'add', lambda age: age + 1)
# 修改age属性
b.age = b.add(b.age)
# 打印age属性
print(b.age)
'''
执行结果:
18
19
'''

delattr 🍀

删除对象中的属性

1
2
3
4
5
6
def delattr(x, y): # real signature unknown; restored from __doc__
"""
Deletes the named attribute from the given object.
delattr(x, 'y') is equivalent to ``del x.y''
"""
pass

实例

1
2
3
4
5
6
7
8
9
10
11
12
class C:
def __init__(self,name,age):
self.name = name
self.age = age
def add(self):
self.age = self.age + 1
c = C('Lyon',18)
# 删除c中的
delattr(c,'name')
# print(c.name) 报错
delattr(c,'add')
# c.add() 报错

本文标题:31.Python之路 - 反射

文章作者:Jesse

发布时间:2020年06月26日 - 09:06

最后更新:2020年06月30日 - 20:06

原始链接:https://jesse.top/2020/06/26/python/04-Object-Oriented/07-Python之路 - 反射/

许可协议: 禁止商业用途 转载请保留原文链接及作者。

坚持原创技术分享,您的支持将鼓励我继续创作!