Python反射机制用沛齐老师总结的话说就是:利用字符串的形式去对象(模块)中操作(寻找)成员。
  • getattr(object, name)
    object代表模块,name代表模块中的属性或成员,该函数表达获取object模块中的
属性或者成员。例如getattr(commons,"login")表示去commons模块里去找
login成员,而这里的login在commons模块里是一个函数名,代表着login的函数体。
  • hasattr(object,name)
    object代表模块,name代表模块中的属性或成员,该函数用于确认object模块中是否存在
name属性或成员,返回只为true或false,可搭配getattr(object,name)方法一起使用。
  • setattr(x, y, v)
    设置某个模块里的成员或属性,setattr(x, 'y', v) is equivalent to ``x.y = v''
  • delattr(x, y)
    删除某个模块里的成员或属性,delattr(x, 'y') is equivalent to ``del x.y''
  • __import__("模块名")
    与普通的import不同的是,__import__()括号里面导入的字符串格式的模块名。
练习一 : 最容易理解的网站资源调用方式:
import commons

def run():
inp = input('请输入要访问的URL:')
if inp == 'login':
commons.login()
elif inp == 'logout':
commons.logout()
elif inp == 'home':
commons.home()
else:
print('')

if __name__ == '__main__': # 通过主函数进行调用
    run()

    # 当用户想要访问login页面的时候,直接模拟输入login字符串,
# 调用导入的commons.login()函数即可打印输出登录页面,
# 调用导入的commons.logout()即可打印退出页面
# 依此类推...
# 但是如果一个网站有成千上万的网页的时候要写成千上万个if-elif-else吗,
# 效率太低了,这个时候就用到了下面的Python的反射。
练习二 : 借助python反射(hasattr()和getattr()方法)来调用网站资源
import commons
def run():
inp = input('请输入要访问的URL:')
if hasattr(commons,inp):
func = getattr(commons, inp)
func()
else:
print('404-页面不存在')

if __name__ == '__main__': # 通过主函数进行调用
    run()

    # 该实例利用了Python反射,inp为接收用户输入字符串,类型为字符串类型
# func代表了commons模块中的login函数名。因此以上语句表达了这样的含义:
# 接收用户输入的一个字符串并赋值给变量inp,通过hasattr函数确认commons模块中
# 是否存在inp属性,如果有的话继续通过getattr()调用该函数并打印,如果没有就打印404 # 我们在浏览器上访问网站上具体某个网页的时候,URL的通常是
# 通过gehttp://www.example.com/account/login这样的结构向服务器发送get或post请求。
# 但是网站上有成千上万个功能模块或网页,而如果要向通过这种结构的URL请求资源的话,
# 就需要将网站目录结构优化一下了。如: # 目录结构优化:
# 与用户账户相关的模块都去account.py中查找,与后台管理的都去manager.py中去查找
# --根目录
# --index.py
# --account.py
# --login()
# --logout()
# --manager.py
# --order() # 要想通过account/login这种方式请求某个资源的时候就必须借助__import__("模块名")来导入模块了。
练习三 : 使用__import__()导入模块,并使用split分割模块与属性,使python反射更灵活
    # __import__() 括号内应该是字符串,通过输入字符串形式的模块名就可以导入该模块了。
# obj = __import__("commons")
# obj.login() 等同与import commons , commons.login() def run():
# 以输入account/login为例(account模块中的login函数)
inp = input('请输入要访问的URL:')
# 通过split将输入inp分割成account模块和login函数,account赋值给m,login赋值给f
m , f = inp.split('/')
# 将m以字符串格式导入,并指向obj
obj = __import__(m)
# 获取到了模块与模块内的属性或函数,就可以继续借助反射来进行操作了。
if hasattr(obj,f):
func = getattr(obj,f)
func()
else:
print('') # 输出结果:
# 请输入要访问的URL:account/login
# 登陆页面

if __name__ == '__main__': # 通过主函数进行调用
    run()

 
练习四 : 导入模块不在当前路径,需要用字符串拼接成完整模块路径,并指定fromlist属性。
# 以上练习时的目录结构基本上都是在同一目录结构里的,如果需要导入的模块在某个文件夹中的时候,在使用
# __import__()导入模块的时候就需要考虑目录结构然后用字符串的拼接成完整的模块路径了,例如以下目录结构。
# 要导入的account放在了lib文件夹下。 # --根目录
# --index.py
# --lib(文件夹)
# --account.py
# --login()
# --logout()
# --manager.py
# --order() def run():
inp = input('请输入要访问的URL:')
m , f = inp.split('/')
# 要导入模块的完整路径:lib.account
# 注意:拼接后的模块路径为"lib.account",但是默认情况下python只会导入点(.)前的第一个模块,也就是lib
# 需要在括号后面加一个fromlist = True属性才可以导入完整的模块路径。
obj = __import__("lib." + m , fromlist=True)
if hasattr(obj,f):
func = getattr(obj,f)
func()
else:
print('')

if __name__ == '__main__': # 通过主函数进行调用
    run()

# 输出结果:
# 请输入要访问的URL:account/login
# 登陆页面
 

commons.py

def login():
print('登陆页面') def logout():
print('退出页面') def home():
print('主页面')

account.py

def login():
print('登陆页面') def logout():
print('退出页面')

Python反射机制理解的更多相关文章

  1. python反射机制深入分析

    对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面结合一个web路由的实例来阐述pyth ...

  2. python 反射机制在实际的应用场景讲解

    剖析python语言中 "反射" 机制的本质和实际应用场景一. 前言 def s1(): print("s1是这个函数的名字!") s = "s1&q ...

  3. Python 反射机制之hasattr()、getattr()、setattr() 、delattr()函数

    反射机制 先看看我对Java中反射机制的通俗理解:反射之中包含了一个“反”的概念,所以要想解释反射就必须先从“正”开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化 ...

  4. 【Python】python 反射机制在实际的应用场景讲解

    剖析python语言中 "反射" 机制的本质和实际应用场景一. 前言 def s1(): print("s1是这个函数的名字!") s = "s1&q ...

  5. python 反射机制 ( 广泛应用于URL参数)

    web实例 考虑有这么一个场景,根据用户输入的url的不同,调用不同的函数,实现不同的操作,也就是一个url路由器的功能,这在web框架里是核心部件之一.下面有一个精简版的示例: 首先,有一个comm ...

  6. (转)JAVA反射机制理解

    JAVA反射机制: 通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运行的时候还可以动态地去操作他们. 理论的东东太多也没 ...

  7. python: 反射机制;

    import comma def run(): inp = input('请输入要调用的函数').strip(); if hasattr(comma,inp): fun = getattr(comma ...

  8. Python 反射机制

    Python的反射机制 Python的反射机制,就是反射就是通过字符串的形式,导入模块:通过字符串的形式,去模块寻找指定函数,并执行.利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员 ...

  9. Python面试题之Python反射机制

    0x00 前言 def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') def f4(): print('f4') a = ...

随机推荐

  1. git合并冲突解决方法

    1.git merge冲突了,根据提示找到冲突的文件,解决冲突 如果文件有冲突,那么会有类似的标记 2.修改完之后,执行git add 冲突文件名 3.git commit 注意:没有-m选项 进去类 ...

  2. hdu2973 YAPTCHA【威尔逊定理】

    <题目链接> 题目大意: The task that is presented to anyone visiting the start page of the math departme ...

  3. java 三目运算符

    三目运算符 可以内嵌使用. level=(input>90)?"Class A":(input>60)?"Class B":"Class ...

  4. Windows 7 Boot Updater 如何使用

    作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E-mail: 313134555 @qq.com 如何使用 动画如果你选择改变动画,你将不得不 ...

  5. TCP/IP通信协议

    TCP/IP 是用于 Internet 的通信协议. 一.什么是 TCP/IP 1.TPC/IP 是供已连接 Internet 的计算机进行通信的协议: 2.TCP(Transmission Cont ...

  6. Kaggle Titanic solution 纯规则学习

    其实就是把train.csv拿出来看了看,找了找规律,调了调参数而已. 找到如下规律: 1.男的容易死,女的容易活 2.一等舱活,三等舱死 3.老人死,小孩活 4.兄弟姐妹多者死 5.票价高的活 6. ...

  7. EBS R12视图打不到数据

    兩個原因引起的,一個是語言,一個是oualter session set nls_language ='AMERICAN';alter session set nls_language='SIMPLI ...

  8. [CGAL]带岛多边形三角化

    CGAL带岛多边形三角化,并输出(*.ply)格式的模型 模型输出的关键是节点和索引 #include <CGAL/Triangulation_vertex_base_with_id_2.h&g ...

  9. Linux下tomcat修改成的80端口无法访问

    转自: https://blog.csdn.net/u013252047/article/details/72834415 tomcat放到服务器上访问8080端口还需要输入端口号,造成访问不便,好多 ...

  10. PHP ~与各加速工具的性能对比~

    参与测试的加速器:Xcache,Opcache,hhvm   Xcache简介 前面已经介绍了PHP加速器的原理和功用(参见LAMP架构之PHP-FPM 服务器),xcache作为目前使用广泛的PHP ...