反射的應用

咱們在來複習一下反射

#demo.py中的程序
#!/usr/bin/env python
#coding:utf-8
def Foo():
    print "demo.foo"
#主程序
#!/usr/bin/env python
#coding:utf-8
str1 = 'demo'
str2 = 'Foo'
module = __import__(str1) # == import demo
funk = getattr(module, str2)
#getattr至關於房戶戶demo模塊中的Foo函數
funk()
#能夠看到getater就是找到foo函數,而且賦給funk函數。
結果:demo.foo

咱們引入反射的應用實例

#account.py文件
#!/usr/bin/env python
#coding:utf-8
#登陸網站相關文件
def login():
    print 'login'
def logout():
    print 'logout'

#index.py文件
#!/usr/bin/env python
#coding:utf-8
from backend import account
data  = raw_input("請輸入URL:")
array = data.split('/')
if data == 'accout/login':
    account.login()
elif data == 'account/logout':
    account.logout()
#這裏咱們的大型網站若是有100個URL是否是咱們要寫100個if呢,這裏咱們就能夠用反射動態獲取。在下面介紹

通常web獲取URL的原理

#這裏admin.py和account.py都時咱們URL的一個分頁面
#admin.py文件
#!/usr/bin/env python
#coding:utf-8
def index():
    print '歡迎登錄後臺管理'

#account.py文件
#!/usr/bin/env python
#coding:utf-8
#登陸網站相關文件
def login():
    print 'login'
def logout():
    print 'logout'

#index.py文件
#!/usr/bin/env python
#coding:utf-8
data  = raw_input("請輸入URL:")
array = data.split('/')
userspance = __import__('backend.'+array[0])
model = getattr(userspance, array[0])
func = getattr(model, array[1])

#至關於先導入一個文件夾,在文件夾中在導入那個模塊,在執行函數。

#這裏__import__ 至關於先導入import backend.account,而後在導入模塊,在執行login()函數,也就是跟正常的沒有區別,先import backend,而後backend.account,而後在backend.account.login

#這裏咱們正常導入模塊時 import bachend.account ,執行的時候是使用backend.account.login(),因此咱們這裏在使用兩次次getattr,這下應該差很少明白了
func()

#一次執行結果:
請輸入URL:admin/index
歡迎登錄後臺管理
相關文章
相關標籤/搜索