python面向对象之反射

2022/3/31 1:49:23

本文主要是介绍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

 



这篇关于python面向对象之反射的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程