博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 学习笔记 - 反射
阅读量:6572 次
发布时间:2019-06-24

本文共 1798 字,大约阅读时间需要 5 分钟。

hot3.png

里面反射指的是可以通过字符串在对象里面(比如一个模块)去操作(查找,删除,判断)一个成员(比如这个模块里面的函数)。

 

比如目前所学的知识,我们需要在模块s1.py中调用一个函数f1,我们需要导入s1.py,然后才能执行f1()

1

2

import s1

s1.f1()

 

如果一个大型软件有几百上千个函数需要调用,那么这样写起来会很累。一个简单的方法是反射。

 

比如一个简单的例子,从index里面调用commons

commons.py

1

2

3

4

5

6

7

8

9

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# Author Yuan Li

def login():

    print("Login Page")

def logout():

    print("Logout Page")

def home():

    print("Home Page")

 

例1:

index.py

1

2

3

4

5

6

7

8

9

10

import commons

 

def run():

    inp=input("Please input a url")

    if inp=='login': login()

    elif inp=='logout':logout()

    elif inp=='home':home()

    elseprint(404)

if __name__ == '__main__':

    run()

 

例2:

我可以通过反射的方式简化上面的操作:hasattr()可以判断一个对象里面是否包含一个成员;getattr()则是获取这个成员。这样无论我在commons里面定义了多少个函数,我都可以通过字符串去直接获取了

index.py

1

2

3

4

5

6

7

8

9

10

11

12

import commons

 

def run():

    inp=input("Please input the Url.\n>>>>")

    

    if hasattr(commons,inp):

        func=getattr(commons,inp)

        func()

    else:

        print("404")

if __name__ == '__main__':

    run()

 

例3:

在例2 的基础上再进一步,如果我们有很多模块,每个模块里面又有很多函数,应该如何处理?当然可以手动import 所有的模块,但是如果模块数目很多,这样也很繁琐。导入模块同样可以通过反射的方式来简化。比如我输入 admin/login,前面的admin表示模块名,后面的login表示这个模块里面的函数名就行了。_import_()可以直接输入字符串的名字来加载对应的模块

 

1

2

3

4

5

6

7

8

9

10

11

12

def run():

    inp=input("Please input the Url.\n>>>>")

    m, f = inp.split('/')

     

    obj=__import__(m)

    if hasattr(obj,f):

        func=getattr(obj,f)

        func()

    else:

        print("404")

if __name__ == '__main__':

    run()

 

例4. 在例3的基础上再进一步,如果这些模块文件在其他的目录下,应该如何调用?

如果我们直接使用 _import_("lib.XX.YY"),那么他只会导入lib这个目录,为了正确识别整个路径,需要添加一个选项 fromlist=True

 

1

2

3

4

5

6

7

8

9

10

11

12

def run():

    inp=input("Please input the Url.\n>>>>")

    m, f = inp.split('/')

    obi=__import__("lib."+m,fromlist=True)

     

    if hasattr(obj,f):

        func=getattr(obj,f)

        func()

    else:

        print("404")

if __name__ == '__main__':

    run()

 

登录乐搏学院官网

或关注我们的官方微博,还有更多惊喜哦~

 

 

本文出自 “” 博客,请务必保留此出处

转载于:https://my.oschina.net/learnbo/blog/872207

你可能感兴趣的文章
我的友情链接
查看>>
自定义View Client 登录方式(一)
查看>>
rsync搭建使用
查看>>
一台服务器上同时运行多个MySQL
查看>>
cenOS+nginx+php+mysql (非一键包安装)
查看>>
优秀程序员不一定是优秀的软件设计师
查看>>
JS系列
查看>>
在文件夹右键菜单中添加“进入DOS”命令的方法
查看>>
我的友情链接
查看>>
我来自CSDN
查看>>
windowns
查看>>
java分享第十七天-02(封装操作excel类)
查看>>
在mysql表中插入大量测试数据
查看>>
怎么给电脑设置IP地址和DNS地址,各系统设置IP/DNS几种方法
查看>>
java 面试题解惑二 到底创建了几个String对象?
查看>>
面试总结之 oop desing 之 The Strategy Pattern
查看>>
必 备 习 题 集 (一)
查看>>
第 三 十 四 天:二 阶 段 复 习(五)
查看>>
windows下批量部署简易脚本
查看>>
python爬虫入门—统计豆瓣电影评论词频
查看>>