Python 从字符串中获取类对象

Python 从字符串中获取类对象,python,django,string,class,getattr,Python,Django,String,Class,Getattr,我编写以下内容是为了为我的URL.py生成URL: urls = { 'overview': { r'^$': [ 'Index' ], r'^/account$': [ 'Account' ], }, 'content': { r'^/content$': [ 'Index' ] r'^/content/upload$': [ 'Uploader', 'Default'

我编写以下内容是为了为我的URL.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()
        ]
    )
我有模块
overview
content
,分别有类
overview
、类
content
和类
Uploader

如果
视图
数组(例如,
['Index']
包含单个元素,我使用模块的大写形式(例如,
概览
变为
概览
)生成路由:

url(r'^$', Overview.as_view(), action='Index')
而如果它包含两个元素(例如,
['Uploader','Default']
),则第一个元素指定类名,第二个元素指定方法:

url(r'^$', Uploader.as_view(), action='Default')
正如您可能已经注意到的,问题在于我使用的
getattr()
,其第一个参数需要类引用。因此,我的问题是是否有任何方法可以从包含所述类对象标识符的字符串中获取类对象,例如
'Uploader'
中的
上传器


作为一个免责声明,这些都不是我的确切路线,只是一个例子。当然,在我的总体设计中也欢迎进一步的评论。

< P>我会说有两种常用的方法。请考虑下面的例子:

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

我认为有两种常用的方法。考虑下面的例子:

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

啊,很有趣。那么,关于第二种方法,
getattr
是否可以对不仅仅是类/对象(即
\uuuuuu main\uuuuu
模块的“符号表”)进行操作,还是模块和类实际上具有相同的性质?(因为它们都具有“属性”)。顺便说一句,谢谢!记住Python中的所有东西都是对象,甚至是模块;)哦,对了,太酷了。那么,Python的语言设计人员是如何使用这种完全面向对象的方法来避免巨大的性能损失的呢?我想我可以在这一点上看看这些东西……啊,很有趣。那么,关于第二种方式,
getattr
是否可以对不仅仅是类/对象(即,
\uuuuuu main\uuuuuu
模块的“符号表”)进行操作,还是模块和类实际上具有相同的性质?(因为它们都有“属性”)。顺便说一下,谢谢!请记住,Python中的所有内容都是对象,即使是模块;)哦,好的,酷。那么,Python的语言设计人员是如何使用这种完全面向对象的方法来避免巨大的性能损失的呢?不过我想我现在可以查一下这些东西。。