4 python string django class getattr
我正在编写以下内容来为我的 urls.py 生成 URL:
urls = {
'overview': {
r'^$': [ 'Index' ],
r'^/account$': [ 'Account' ],
},
'content': {
r'^/content$': [ 'Index' ]
r'^/content/upload$': [ 'Uploader', 'Default' ]
}
}
urlpatterns = patterns('')
for module, spec in urls.iteritems():
urlpatterns += patterns('views.'+ module,
[
url(regex, (getattr(module.capitalize() , 'as_view'))(), action=view[0])
if len(view) == 1 else
url(regex, (getattr(view[0], 'as_view'))(), action=view[1])
for regex, view in spec.iteritems()
]
)
Run Code Online (Sandbox Code Playgroud)
我有模块overview和content,分别带有类Overview,和Content和Uploader。
如果view数组(例如,[ 'Index' ]包含单个元素),我使用模块的大写形式(例如,overview变为Overview)来生成路线:
url(r'^$', Overview.as_view(), action='Index')
Run Code Online (Sandbox Code Playgroud)
而如果它包含两个元素(例如[ 'Uploader', 'Default' ]),则第一个元素指定类名,第二个元素指定方法:
url(r'^$', Uploader.as_view(), action='Default')
Run Code Online (Sandbox Code Playgroud)
您可能已经注意到,问题出在我对 的使用上getattr(),它的第一个参数需要类引用。所以,我的问题是是否有任何方法可以从包含所述类对象的标识符的字符串中获取类对象,例如Uploader来自 的类'Uploader'。
作为免责声明,这些不是我的确切路线,只是一个例子。当然,也欢迎对我的整体设计提出进一步的评论。
我想说有两种常见的方法。考虑下面的例子:
from random import choice
class A(object):
def __init__(self):
self.name = 'in A'
class B(object):
def __init__(self):
self.name = 'in B'
class C(object):
def __init__(self):
self.name = 'in C'
if __name__ == "__main__":
classes = ['A', 'B', 'C']
class_name = choice(classes)
print class_name
# 1st way
obj = globals()[class_name]()
print obj.name
# 2nd way
import sys
obj = getattr(sys.modules['__main__'], class_name)()
print obj.name
# 3rd way - not recommended
obj = eval(class_name)()
print obj.name
Run Code Online (Sandbox Code Playgroud)