前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python功能之反射

Python功能之反射

作者头像
py3study
发布2020-01-14 01:03:20
2780
发布2020-01-14 01:03:20
举报
文章被收录于专栏:python3

有如下文件:

index.py

代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'ryan'
"""
import home
print 'oldboy....'
url=raw_input('url:')
if url == 'home/dev':
    ret = home.dev()
    print ret
if url =='/home/index':
    ret = home.index()
    print ret
if url =='/home/user':
    ret = home.user
    print ret
if url == '/home/passwd':
    ret = home.passwd
    print ret
else:
    print '404'
"""
#getattr、setattr、delattr、 hasattr
#找到home文件,将内容加载到内存,然后getattr、setattr、delattr、 hasattr 对home中断函数进行操作
#由于函数在没有执行之前,只是将函数名放入内存
import home
#print dir(home)
#print hasattr(home,'dev')#通过函数hasattr到内存中找到home模块,判断home模块下是否存在dev函数,
#有返回True,否则返回false
#print dir(home)
#print getattr(home,'dev')#到内存中的home模块中去获取函数dev(其实时获取dev函数在内存中的地址)
#print setattr(home,'alex','gentle man')#通过setattr对内存中的home模块添加一个字符串alex
#print dir(home)
#delattr(home,'dev')#通过delattr删除内存中home模块中的dev函数
#print dir(home)
#
"""
class Foo:
    static_name='nba'
    def __init__(self):
        self.name='alex'
    def show(self):
        pass
    @staticmethod
    def static_show(self):
        pass
    @classmethod
    def class_show(cls):
        pass
#obj=Foo()
#print Foo.__dict__.keys() #查看类里面的成员
#print hasattr(Foo,'static_show')
#print obj.__dict__#查看对象里有哪些成员
#print hasattr(obj,'name')
#print hasattr(obj,'show')#普通方法是存储在类里,
#但是这里用hasattr函数在对象obj中查找是否存在show方法,
#返回了Ture,原因是在对象obj中没有找到之后会通过对象指针到创建对象的类中进一步查找,
#所以这里返回True
"""
"""
print hasattr(Foo,'__init__')
print "##########分隔符①################"
print hasattr(Foo,'static_name')
print "##########分隔符②################"
print hasattr(Foo,'show')
print "##########分隔符③################"
print hasattr(Foo,'static_show')
print "##########分隔符④################"
print hasattr(Foo,'class_show')
obj=Foo()
print obj.__dict__
print hasattr(obj,'show')
print hasattr(obj,'__init__')
print "##########分隔符①################"
print hasattr(obj,'static_name')
print "##########分隔符②################"
print hasattr(obj,'show')
print "##########分隔符③################"
print hasattr(obj,'static_show')
print "##########分隔符④################"
print hasattr(obj,'class_show')
"""
"""
import home
cls = getattr(home,"Foo")
print cls
s_name = getattr(cls,'static_name')
print s_name
c_show = getattr(cls,'show')
print c_show
s_show=getattr(cls,'static_show')
print s_show
cla_show = getattr(cls,'class_show')
print cla_show
"""
import home
cls = getattr(cls,'Foo')
obj=cls()#实例化一个对象obj
name = getattr(obj,'name')
print name

home.py

代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'ryan'
def index():
    return 'result home.index'
def dev():
    return 'result home.dev'
def user():
    return 'result home.user'
def passwd():
    return 'result home.passwd'
"""
class Foo:
    static_name='nba'
    def __init__(self):
        self.name='alex'
    def show(self):
        pass
    @staticmethod
    def static_show(self):
        pass
    @classmethod
    def class_show(cls):
        pass
"""

反射

fanshe.py

代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'ryan'
url = raw_input('url:')
controller,action =url.split('/')
import home
#action动作是一个字符串,去某个容器(模块)中去找函数,字符串即为函数名,
#如果有则获取函数
func =getattr(home,action)
func = dev dev1():
     return 'result home.dev'
     ret = func()
#func=getattr(home,'index')
ret=func()
print ret

webdemo.py

代码语言:javascript
复制
#!/usr/bin/env python
#coding:utf-8
from wsgiref.simple_server import make_server
def RunServer(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    url = environ['PATH_INFO']
    temp = url.split('/')[1]
    import home
    #去home模块中检查,是否含有指定的函数
    is_exist = hasattr(home, temp)
    #如果存在指定的函数
    if is_exist:
        #获取函数
        func = getattr(home, temp)
        #执行函数并获取返回值
        ret = func()
        #将函数返回值响应响应给请求者,即浏览器
        return ret
    else:
        #如果不存在函数则返回给浏览器'404 not found'
        return '404 not found'
if __name__ == '__main__':
    httpd = make_server('', 8001, RunServer)
    print "Serving HTTP on port 8001..."
    httpd.serve_forever()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/07/17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档