编程语言
首页 > 编程语言> > python面向对象之反射

python面向对象之反射

作者:互联网

反射

通过字符串操作类对象 或者 模块中的相关成员的操作

(1)类中的反射
hasattr() 检测对象/类是否有指定的成员
getattr() 获取对象/类成员的值
setattr() 设置对象/类成员的值
delattr() 删除对象/类成员的值

(2)模块的反射
sys.modules 返回一个系统字典,字典的键是加载的所有模块

part1 通过字符串反射类对象中的成员

class Father():
    pass

class Mother():
    pass
    
class Children(Father,Mother):
    eye = "蓝色的"
    weight = "1吨"
    
    def eat(self):
        print("小孩下生会喝奶")
    
    def drink(self):
        print("小孩下生喜欢喝勇闯天涯...")
        
    def __la(self):
        print("小孩自动啦,无法控制")
    
obj = Children()
    
# (1)hasattr() 检测对象/类是否有指定的成员
# 对象
res = hasattr(obj,"eye")
print(res)

# 类
res = hasattr(Children,"eat123")
print(res)


# (2)getattr() 获取对象/类成员的值
# 对象
res = getattr(obj,"weight")
print(res)
# 如果获取的值不存在,可以设置第三个参数,防止报错
res = getattr(obj,"weight123","抱歉这个值不存在")
print(res)

# 类
# 通过类进行反射 (反射出来的是普通方法)
func = getattr(Children,"drink")
print(func)
func(1)
# 通过对象进行反射 (反射出来的是绑定方法)
func = getattr(obj,"drink")
print(func)
func()

# 综合案例
strvar = "eat11"
if hasattr(obj,strvar):
    func = getattr(obj,strvar)
    func()
else:
    print("抱歉,该成员不存在")


# (3) setattr() 设置对象/类成员的值
# 对象
setattr(obj,"skin","黑人")
print(obj.skin)
# 类
setattr(Children,"skin","土耳其人")
print(Children.skin)
print(obj.skin)

# (4) delattr() 删除对象/类成员的值 
# 对象
# delattr(obj,"skin")
# print(obj.skin)

# 类
# delattr(Children,"skin")
# print(Children.skin)
View Code

part2 通过字符串反射模块中的成员

"""
sys.modules 返回一个系统字典,字典的键是加载的所有模块
'__main__': <module '__main__' from '/mnt/hgfs/python32_gx/day25/2.py'>
字典中的__main__这个键对应的是该文件的模块对象;
"""

def func1():
    print("我是func1方法")
def func2():
    print("我是func2方法")
def func3():
    print("我是func3方法")

import sys
print(sys.modules) # 系统字典
module = sys.modules["__main__"]
print(module)
res = getattr(module,"func1")
print(res)

# 综合案例 : (通过字符串反射模块中的成员)
while True:
    strvar = input("请输入你想要使用的功能:")
    if hasattr(module,strvar):
        func = getattr(module,strvar)
        func()
    elif strvar.upper() == "Q":
        print("再见")
        break
    else:
        print("没有该成员~!")
View Code

 

标签:反射,obj,python,res,面向对象,getattr,func,skin,print
来源: https://www.cnblogs.com/shuaiyao666/p/16079952.html