面向对象(六)-反射方法

反射方法

反射:不需要直接调用对象的属性或是方法,通过提供需要运行的方法或属性的名字(字符串),直接内存中搜索有没有与之相同的属性或方法,如果存在直接可以运行即可。

作用:提高代码容错性以及提升开发效率,扩展性很高

# 需求:定义用户,人能够说话,唱歌,跳舞.... 
# 根据用户的输入,去调用相应的方法或属性 
class User: 
      age = 20 
      gender = "男" 

      def speak(self): 
            print("会说话") 

      def sing(self): 
            print("唱歌") 

      def dancing(self): 
            print("跳舞") 

zs = User() 
method = input("请输入您要调用的方法:")
 #如何区分属性还是方法? 
if hasattr(zs,method): 
      method = getattr(zs,method) 
      if callable(method): # 判定对象是否可被调用 
            method() # 调用方法 
      else:
            print(method) # 打印属性 
else:
      print("输入有误")

** 常用反射方法 **

1 hasattr(obj,name_str) :判断object对象是否具有name_str属性或是方法,返回布尔值

if hasattr(zs,choice): 
      choice = getattr(zs,choice) 
      choice() 
else:print("输入有误")

2 getattr(obj,name_str):获取object对象中与name_str同名的方法或者函数

if hasattr(zs,choice): 
      choice = getattr(zs,choice) 
      choice() 
else:
      print("输入有误")

3 setattr(obj,name_str,value):为object对象设置一个以name_str为名的value方法或者属性

def wrong(): 
      print("输入有误") 
if hasattr(zs,choice): 
      choice = getattr(zs,choice) 
      choice() 
else:
      # 设置属性或方法 
      setattr(zs,choice,wrong)
      # 获取属性或方法 
      getattr(zs,choice)()

4 delattr(obj,name_str):删除object对象中的name_str方法或者属性

if hasattr(zs,choice): 
      delattr(zs,choice) # 删除实例属性 
      delattr(Person,choice) # 删除实例方法或是类属性 
      if hasattr(zs, choice): 
            print(getattr(zs,choice)) 
      else:
            print(f"没有{choice}属性") 
else:
      print("输入有误")
posted @ 2020-12-30 15:07  小杜打醋尢买布  阅读(94)  评论(0编辑  收藏  举报