【问题标题】:Get class object from string从字符串中获取类对象
【发布时间】:2013-07-01 00:19:22
【问题描述】:

我正在编写以下内容来为我的 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()
        ]
    )

我有模块overviewcontent,分别有OverviewContentUploader 类。

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

url(r'^$', Overview.as_view(), action='Index')

如果它包含两个元素(例如,[ 'Uploader', 'Default' ]),第一个元素指定类名,第二个元素指定方法:

url(r'^$', Uploader.as_view(), action='Default')

您可能已经注意到,问题在于我使用了getattr(),它的第一个参数需要类引用。所以,我的问题是是否有任何方法可以从包含所述类对象标识符的字符串中获取类对象,例如来自'Uploader'Uploader 类。

作为免责声明,这些不是我的确切路线,只是一个例子。当然,关于我在这里的整体设计,也欢迎进一步的 cmets。

【问题讨论】:

    标签: python django string class getattr


    【解决方案1】:

    我想说有两种常见的方法。考虑下面的例子:

    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 可以操作的不仅仅是类/对象(即__main__ 模块的“符号表”),还是模块和类实际上是相同的自然? (因为他们都有“属性”)。顺便谢谢!
    • 请记住,Python 中的一切都是对象,甚至是模块;)
    • 哦,对了,很酷。那么 Python 的语言设计者是如何通过这种完全面向对象的方法避免严重的性能损失的呢?我想我现在可以看看这些东西了..
    猜你喜欢
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 2013-02-04
    • 2013-06-06
    相关资源
    最近更新 更多