【专题】详解Python中的反射机制

一、反射的概念

python的反射机制,核心就是利用字符串去已存在的模块中找到指定的属性或方法,找到方法后自动执行——基于字符串的事件驱动。

二、熟悉面向对象的属性方法

  • hasattr(object,'attrName'):判断该对象是否有指定名字的属性或方法,返回值是bool类型
  • setattr(object,'attrName',value):给指定的对象添加属性以及属性值
  • getattr(object,'attrName'):获取对象指定名称的属性或方法,返回值是str类型
  • delattr(object,'attrName'):删除对象指定名称的属性或方法值,无返回值
class Fruit:
    # 构造方法
    def __init__(self,name,color):
        self.name = name
        self.color = color
    # 类的普通方法
    def buy(self,price,num):
        print("水果的价格是:",price*num)
"""
    hasattr(object,'attrName'):判断该对象是否有指定名字的属性或方法,返回值是bool类型
    setattr(object,'attrName',value):给指定的对象添加属性以及属性值
    getattr(object,'attrName'):获取对象指定名称的属性或方法,返回值是str类型
    delattr(object,'attrName'):删除对象指定名称的属性或方法值,无返回值
"""       
apple = Fruit("苹果","红色")
print(hasattr(apple,'name')) # 判断对象是否有该属性或方法
print(hasattr(apple,'buy'))

# 获取对象指定的属性值
print(getattr(apple,'name'))
print(apple.name)

f = getattr(apple,'buy')
f(5,10)
# 设置对象对应的属性
setattr(apple,'weight',100)

# 删除对象对应的属性
delattr(apple,'name')
print(hasattr(apple,'name'))

注:getattr,hasattr,setattr,delattr对模块的修改都在内存中进行,并不会影响文件中真实内容。

三、面向对象的反射机制

需求描述:用户通过输入字符串来调用对象的对应方法,通过模拟一个服务器响应用户的请求,设置有注册页、登录页、主页、关于页以及错误页。

class WebSite:
    def register(self):
        print("欢迎来到注册页面")
    
    def login(self):
        print("欢迎来到登录页面")
    
    def home(self):
        print("欢迎进入主页")
        
    def about(self):
        print("关于我们")
        
    def error(self):
        print("404 No Found!")

page = WebSite()        
while True:
    choose = input("请输入你要进入的页面>>>")
    if choose == 'register':
        page.register()
    elif choose == 'login':
        page.login()
    elif choose == 'home':
        page.home()
    elif choose == 'about':
        page.about()
    else:
        page.error()

由于代码段对用户的请求页判断的代码块冗长,并且当新增一个网页时也要实时修改对应的主体代码,维护起来不方便。

class WebSite:
    def register(self):
        print("欢迎来到注册页面")
    
    def login(self):
        print("欢迎来到登录页面")
    
    def home(self):
        print("欢迎进入主页")
        
    def about(self):
        print("关于我们")
        
    def error(self):
        print("404 No Found!")

page = WebSite()        
while True:
    choose = input("请输入你要进入的页面>>>")
    # 反射机制实现上述功能,优化代码结构
    if hasattr(page,choose):
        f = getattr(page,choose)
    else:
        page.error()

通过应用面向对象操作属性的方法很好的解决了这个问题,这就是反射机制。Python面向对象中的反射:通过字符串的形式操作对象相关的属性。

四、实例应用

在正式介绍实际web开发中的应用场景之前,先来看看这样的一个模块。

# 模块:importlib
import importlib
res = 'myfile.b'
# 传入字符串路径,调用importlib类,实现 from myfile import b
ret = importlib.import_module(res) 
# 该方法最小只能到.py文件名即模块
print(ret)

是的,稍微阅读一下上面的实例代码就可以知道importlib模块的功能是:即安装字符串式的路径自动导入模块,调用importlib.import_module()方法,但该方法的最小粒度只能达到.py文件名即模块。

需求描述:输入多层的模块路径,自动生成对象并调用该类的方法。比如:notify.email.Emailnotify包下面有模块email,模块email中包括了Email类,利用该类声明对象,并调用其中的send()方法。

import importlib
#'notify.email.Email'
path_str = input("请输入包-模块-类的字符串路径:")
module_path,class_name = path_str.rsplit('.',maxsplit=1)
# 1 利用字符串导入模块
module = importlib.import_module(module_path)  # from notify import email
# 2 利用反射获取类名
cls = getattr(module,class_name)  # Email、QQ、Wechat
# 3 生成类的对象
obj = cls()
# 4 直接调用send方法
obj.send()
  • 5
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Python反射是指通过字符串的形式去访问对象的属性、方法和其他成员。Python的每个对象都有一组内置的特殊属性和方法,比如 `__dict__`、`__class__`、`__name__`、`__bases__` 等等。这些属性和方法可以通过反射机制来访问和操作。 Python反射通常涉及到以下三个内置函数: 1. `hasattr(object, attribute)`:检查对象是否具有指定的属性或方法。 2. `getattr(object, attribute[, default])`:获取对象的属性或方法。如果属性或方法不存在,则返回默认值(如果指定了)或引发 AttributeError 异常。 3. `setattr(object, attribute, value)`:设置对象的属性或方法。 下面是一些示例: ```python class MyClass: def __init__(self): self.x = 10 def my_method(self): print("Hello, World!") # 创建一个对象 obj = MyClass() # 使用 getattr 获取对象的属性和方法 print(getattr(obj, 'x')) # 输出: 10 getattr(obj, 'my_method')() # 输出: Hello, World! # 使用 hasattr 检查对象是否具有属性和方法 print(hasattr(obj, 'x')) # 输出: True print(hasattr(obj, 'y')) # 输出: False # 使用 setattr 设置对象的属性和方法 setattr(obj, 'y', 20) print(obj.y) # 输出: 20 setattr(obj, 'my_method', lambda: print("Hello, Python!")) obj.my_method() # 输出: Hello, Python! ``` 除了使用内置函数之外,Python还有另一种反射机制,即使用元类。元类是用于创建类的类,可以通过元类来动态地创建、修改和删除类的属性和方法。元类的使用超出了本文的范围,感兴趣的读者可以自行学习。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值