Python 学习笔记 - 反射

简介:

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


比如目前所学的知识,我们需要在模块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()
     else print ( 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()






本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1850874,如需转载请自行联系原作者

目录
相关文章
|
网络协议 Java Linux
PyAV学习笔记(一):PyAV简介、安装、基础操作、python获取RTSP(海康)的各种时间戳(rtp、dts、pts)
本文介绍了PyAV库,它是FFmpeg的Python绑定,提供了底层库的全部功能和控制。文章详细讲解了PyAV的安装过程,包括在Windows、Linux和ARM平台上的安装步骤,以及安装中可能遇到的错误和解决方法。此外,还解释了时间戳的概念,包括RTP、NTP、PTS和DTS,并提供了Python代码示例,展示如何获取RTSP流中的各种时间戳。最后,文章还提供了一些附录,包括Python通过NTP同步获取时间的方法和使用PyAV访问网络视频流的技巧。
3132 4
PyAV学习笔记(一):PyAV简介、安装、基础操作、python获取RTSP(海康)的各种时间戳(rtp、dts、pts)
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
630 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
626 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
关系型数据库 MySQL 数据库
Mysql学习笔记(四):Python与Mysql交互--实现增删改查
如何使用Python与MySQL数据库进行交互,实现增删改查等基本操作的教程。
190 1
|
Ubuntu Linux Python
Ubuntu学习笔记(六):ubuntu切换Anaconda和系统自带Python
本文介绍了在Ubuntu系统中切换Anaconda和系统自带Python的方法。方法1涉及编辑~/.bashrc和/etc/profile文件,更新Anaconda的路径。方法2提供了详细的步骤指导,帮助用户在Anaconda和系统自带Python之间进行切换。
539 1
|
索引 Python
Python学习笔记编程小哥令狐~持续更新、、、(上)
Python学习笔记编程小哥令狐~持续更新、、、(上)
158 2
|
索引 Python
【免费分享编程笔记】Python学习笔记(一)
【免费分享编程笔记】Python学习笔记(一)
105 1
|
存储 Python
Python学习笔记编程小哥令狐~持续更新、、、 (下)
Python学习笔记编程小哥令狐~持续更新、、、 (下)
113 1
|
Java 编译器 Go
Python学习笔记--- day01计算机基础和环境搭建(一)
Python学习笔记--- day01计算机基础和环境搭建(一)
197 2
|
存储 Python
【免费分享编程笔记】Python学习笔记(二)
【免费分享编程笔记】Python学习笔记(二)
147 0
【免费分享编程笔记】Python学习笔记(二)