python的反射机制

假如现在一个场景,需要根据用户输入的url,调用不同的函数,实现不同的操作,也就是一个url路由器的功能,这在web框架里是核心部件之一。下面是小A的实现方法:

# author:别动我名字
# contact: 172212595@qq.com
# datetime:2019/4/10 22:36
# software: PyCharm Community Edition

"""
文件说明: 反射

"""


class MyClass():
    """
    MyClass用于实现不同方法的调用
    """
    def login(self):
        print("这是一个登陆页面!")

    def logout(self):
        print("这是一个退出页面!")

    def home(self):
        print("这是网站主页面!")

# 这里可以接收用户输入的内容
inp = input("请输入您想访问页面的url: ").strip() # 这里可以输入login
# 有人可能想到,直接在对象后面拼接用户输入的变量。但是在调用MyClass的时候它并不会认为你是个变量
# MyClass().inp()
# 报错 AttributeError: 'MyClass' object has no attribute 'inp'

# 正确实现方式
my=MyClass()
if inp == "login":
    my.login()
elif inp == "logout":
    my.logout()
elif inp == "home":
    my.home()
else:
    print("404")

以上部分小a就实现了根据用户输入的不同url执行不同函数,但是如果模块有很多函数,全部都要if elif来实现吗?这时候就需要用到反射了


class MyClass():
    """
    MyClass用于实现不同方法的调用
    """

    def login(self):
        print("这是一个登陆页面!")

    def logout(self):
        print("这是一个退出页面!")

    def home(self):
        print("这是网站主页面!")

my=MyClass()
inp = input("请输入您想访问页面的url: ").strip()
if hasattr(my, inp):  # 用于判断my对象中是否具有inp成员,是则返回True,没有则返回False
    func=getattr(my, inp) #  它接收2个参数,前面的是一个对象或者模块,后面的是一个字符串,注意了!是个字符串!返回内存地址
    print(func)# <bound method MyClass.login of <__main__.MyClass object at 0x00000150A67F6668>>
    func()
else:
    print("404")
    

总结:
hasattr(obj,name_str)判断对象obj中是否包含name_str字符串的方法
getattr(obj,name_str)根据字符串name_str获取对象obj对象中的内存地址

上面介绍了getattr、hasattr两个内置函数,python除了以上两个,还有delattr和setattr这里就不做介绍可以参考这里

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转自:http://www.cnblogs.com/feixuelove1009/p/5576206.html,只...
    think_lonely阅读 7,210评论 1 2
  • 前言 def s1(): print("s1是这个函数的名字!") s = "s1" print("%s是个字符串...
    lijun_m阅读 5,066评论 0 2
  • 首先说说反射是什么?反射是可以以字符串的形式动态调用函数的过程。 当然反射不只是字符串的函数执行,她和exec和e...
    enhengz阅读 3,130评论 0 0
  • 跑了一天累的腿都酸了,就要了三個微信,無語了,明天繼續努力吧,希望有奇跡,多幾個主動點的女生,這樣我們才有故事,哈...
    勇者_08ce阅读 825评论 0 0
  • 在问答题中,存在着“非此即彼”的形式,通常只有两种答案。这样的题从概率上来说,有百分之五十的可能答对。如果很多问题...
    牧云天边阅读 5,252评论 0 6