• 反射 | hasattr() | getattr() | setattr() | delattr() 的使用方法


    # ### 与类相关的魔术属性
    class Human():
    	pass
    
    class Man():
    	pass
    	
    class Woman():
    	pass
    	
    class Children(Man,Woman):
    	'''
    	类的功能: 描述一个小孩
    	类的成员属性:eye
    	类的成员方法:sleep __beat_doudou
    	'''
    	eye = "蓝色眼睛"
    	# 普通方法
    	def eat():
    		print("小孩喜欢吃东西")
    		
    	# 绑定方法
    	def sleep(self):
    		print("小孩喜欢睡觉,一天睡20个小时候")
    
    	def drink(self):
    		print("小孩喜欢喝水,喝水尿")
    		
    	def cry(self,func):
    		res = func.__name__
    		print(res,type(res))
    		
    	# 私有绑定方法
    	def __beat_doudou(self):
    		print("小孩喜欢打豆豆")
    
    
    # __dict__ 获取对象或类的内部成员结构
    obj = Children()
    res = obj.__dict__
    print(res)
    print(Children.__dict__)
    
    # __doc__  获取对象或类的内部文档
    res = Children.__doc__
    print(res)
    
    # __name__ 获取类名函数名
    def myfunc():
    	print("我是函数")
    obj.cry(myfunc)	
    
    # __class__ 获取当前对象所属的类
    res = obj.__class__
    print(res)
    
    # __bases__ 获取一个类直接继承的所有父类,返回元组
    res = Children.__bases__
    print(res)
    
    
    # ### 反射
    # 概念:通过字符串去操作类对象 或者 模块中的属性方法
    
    # (1)hasattr() 检测对象/类是否有指定的成员 [以是否能够调用为基准]
    res = hasattr(obj,"eye")
    print(res)
    res = hasattr(Children,"eat")
    print(res)
    
    # (2)getattr() 获取对象/类成员的值
    res = getattr(obj,"eye")
    print(res)
    res = getattr(obj,"sleep")
    print(res) # 它返回的是一个绑定方法
    res()
    res = getattr(Children,"eat")
    print(res)
    res()
    res = getattr(Children,"sleep")
    print(res) # 它不是一个绑定方法
    res(123)
    
    # getattr 第三个参数可选,如果获取不到这个值,可以添加默认提示.预防报错
    res = getattr(obj,"abc","对不起这个真没有")
    print(res)
    
    
    # strvar = input("请输入您要调用的函数")
    # if hasattr(obj,strvar):
    	# res = getattr(obj,strvar)
    	# res()
    
    
    # (3)setattr() 设置对象/类成员的值
    setattr(obj,"hair","屎黄色")
    print(obj.hair)
    setattr(Children,"skin","绿色")
    print(Children.skin)
    
    
    # (4)delattr() 删除对象/类成员的值 
    delattr(obj,"hair")
    # print(obj.hair)
    delattr(Children,"skin")
    # print(Children.skin)
    
    # (2)模块的反射
    # sys.modules 返回一个系统字典,字典的键是加载的所有模块
    import sys
    res = sys.modules
    print(res)
    print(__name__) #__main__
    mymodule = sys.modules[__name__]
    print(mymodule) # 模块对象
    
    def func1():
    	print("这是func1方法")
    def func2():
    	print("这是func2方法")
    def func3():
    	print("这是func3方法")
    
    # 用户给我字符串,我反射对应的方法调用
    while True:
    	strvar  = input("请输入您要调用的方法")
    	
    	if hasattr(mymodule,strvar):
    		_func_ = getattr(mymodule,strvar)
    		_func_()
    	else:
    		print("大哥,没有")
    

      

  • 相关阅读:
    C#的GroupBy方法是如何工作的
    流媒体技术探索(一)
    战争雷霆-鼠标穿透
    继承与ER图
    从零开始的文档对象模型(结束更新)
    [hackerrank] booking.com
    [lintcode][美国大公司][1.字符串处理]
    [interview] Aug. 2015
    [codility] Lesson 2 Counting Elements
    [codility] Lesson 1 Time Complexity
  • 原文地址:https://www.cnblogs.com/huangjiangyong/p/10946983.html
Copyright © 2020-2023  润新知