python学习-反射

web框架路由实例

根据用户的输入的 URL 不同,调用不同的页面

account.py 模块中存放了 login,logout,home 三个页面函数

# /user/bin/env python
__author__ = ‘wenchong‘

def login():
    print(‘这是一个登陆页面‘)

def logout():
    print(‘这是一个退出页面‘)

def home():
    print(‘这是主页‘)

web.py 文件为框架入口文件,通过 if...elif...else 实现 web 路由

# /user/bin/env python
__author__ = ‘wenchong‘

from account import login, logout, home

def main():
    url = input("请输入一个 URL:")

    if url == ‘login‘:
        login()
    elif url == ‘logout‘:
        logout()
    elif url == ‘home‘:
        home()
    else:
        print(‘404‘)

if __name__ == ‘__main__‘:
    main()

通过反射实现 web 路由

通过 web.py 可以实现用户输入不同的内容返回不同的页面,但是如果 account.py 中有很多的页面函数,那么我们就需要在 web.py 中写更多的 elif ,显然是不现实的。

修改 web.py 的内容

# /user/bin/env python
__author__ = ‘wenchong‘

import login

def main():
    url = input("请输入一个 URL:")

    if hasattr(account,‘url‘):
        func = getattr(account,‘url‘)
        func()
    else:
        print(‘404‘)

if __name__ == ‘__main__‘:
    main()

hasattr() 检查 account 中是否有 url 变量对应值的属相,如果有,则获取该属性,并执行,否则返回 404

如果输入的 URL 为 account/login,并且 account.py 和 web.py 在同级目录下

# /user/bin/env python
__author__ = ‘wenchong‘

def main():
    url = input("请输入一个 URL:")

    m,f = url.split("/")
    obj = __import__(m)
    if hasattr(obj,f):
        func = getattr(obj,f)
        func()
    else:
        print(‘404‘)

if __name__ == ‘__main__‘:
    main()

如果 account.py 和 web.py 不在同级目录下,account.py 在 lib 子目录下

# /user/bin/env python
__author__ = ‘wenchong‘

def main():
    url = input("请输入一个 URL:")

    m,f = url.split("/")
    # fromlist 参数设置为 True,否则只会导入 lib,而不会导入 account
    obj = __import__(‘lib.‘+m, fromlist=True)
    if hasattr(obj,f):
        func = getattr(obj,f)
        func()
    else:
        print(‘404‘)

if __name__ == ‘__main__‘:
    main()

补充

getattr(object,name,default)   通过字符串获取对象的一个属性,当 object 中无 name 属性,则返回 default

hasattr(object,name)  检查 object 对象中是否有 name 属性,有则返回 True,否则返回 False

setattr(x,y,v)  为一个对象,增加一个属性,等于  x.y = v

delattr(x,y)  删除对象的一个属性,等于 del x.y

__import__(name,fromlist=())  导入 name 模块,当 name 为 ‘x.y‘ ,如果 fromlist 为空,则只会导入 x

时间: 2024-11-23 12:21:22

python学习-反射的相关文章

Python学习——反射

class Foo(object): def __init__(self): self.name = 'wupeiqi' # self.age = age def func(self): print("func is running.") return 'func' obj = Foo() # #### 检查是否含有成员 #### print(hasattr(obj, 'name')) print(hasattr(obj, 'func')) # # #### 获取成员 #### pri

python学习——反射练习

1.类变量和实例变量的区别? 类变量:类内定义的变量 实例变量:类外定义的变量 2.super的作用? 调用对象按照调用函数继承类的顺序寻找下一个 3.isinstance和type的区别并用代码举例说明 isinstance 检查第一个参数(对象)是否时第二个参数(类)的实例 class Foo(object): pass obj = Foo() print(obj,isinstance(obj,Foo)) type是获取对象是哪个类创建的 class Foo(object): pass ob

python学习之反射

python学习反射 实例1 脚本内容如下: #coding: utf8 class myClass(object): def fax(self): print 'faxing....' def copy(self): print 'copying...' def printing(): print 'printing....' m = myClass() if hasattr(m,'fax'):          #判断myClass类中是否有fax方法 func = getattr(m,'f

Python 学习笔记 - 反射

Python里面反射指的是可以通过字符串在对象里面(比如一个模块)去操作(查找,删除,判断)一个成员(比如这个模块里面的函数). 比如目前所学的知识,我们需要在模块s1.py中调用一个函数f1,我们需要导入s1.py,然后才能执行f1() import s1 s1.f1() 如果一个大型软件有几百上千个函数需要调用,那么这样写起来会很累.一个简单的方法是反射. 比如一个简单的例子,从index里面调用commons commons.py #!/usr/bin/env python # -*- c

Python学习记录day6

Python学习记录day6 学习 python Python学习记录day6 1.反射 2.常用模块 2.1 sys 2.2 os 2.3 hashlib 2.3 re 1.反射 反射:利用字符串的形式去对象(默认)中操作(寻找)成员 cat commons.py #!/usr/bin/env python#_*_coding:utf-8_*_''' * Created on 2016/12/3 21:54. * @author: Chinge_Yang.''' def login(): pr

Python学习记录day3

Python学习记录 day3 今天是银角大王武sir讲课.先回顾了上节课所学,然后讲到了面向对象思想. set set是一个无序且不重复,可嵌套的元素集合 class set(object):     """     set() -> new empty set object     set(iterable) -> new set object     Build an unordered collection of unique elements.     

Python学习—面向对象学习下

面向对象下 1.构造方法与析构方法 class People(object): # 构造方法:__init__(),在实例化对象时自动执行的方法 def __init__(self, name, age): self.name = name self.age = age print("创建对象成功.......") # 析构函数:__del__(), 当你删除对象时,自动调用的方法 # 删除对象:del 对象名 def __del__(self): print("删除对象成功

python学习:程序控制结构·作业20141219

Python学习:程序控制结构 20141219 编程环境: windows 7 x64 python 2.7.6 题目: 1 编写程序,完成下列题目(1分) 题目内容: 如果列出10以内自然数中3或5的倍数,则包括3,5,6,9.那么这些数字的和为23.要求计算得出任意正整数n以内中3或5的倍数的自然数之和. 输入格式: 一个正整数n. 输出格式: n以内中3或5的倍数的自然数之和. 输入样例: 10 输出样例: 23 时间限制:500ms内存限制:32000kb n = int(raw_in

python学习第二天

python学习的第二天就是个灾难啊,这天被打击了,自己写的作业被否认了,不说了,写博客还是个好习惯的,要坚持下去,就不知道能坚持到什么时候.呵呵!!! 这天教的知识和第一天的知识相差不大,区别在于比第一天讲的更细了(我们是两个老师教的,风格是不一样的),这次也写那些比较细的知识点. python的简介 (1)你的程序一定要有个主文件. (2)对于python,一切事物都是对象,对象基于类创建.#似懂非懂,不过有那么点似懂. 知识点 #__divmod__ 会把两个数字相除的商和余数以元组的方式