2

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()
        ]
    )

モジュールoverviewとがあり、それぞれcontentクラスOverviewととがあります。ContentUploader

view配列 (例:[ 'Index' ]単一の要素を含む) の場合、モジュールの大文字形式 (例: become ) を使用しoverviewOverviewルートを生成します。

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

一方、2 つの要素 (例: [ 'Uploader', 'Default' ]) が含まれる場合、最初の要素はクラス名を指定し、2 番目の要素はメソッドを指定します。

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

お気づきかもしれませんが、問題は、getattr()最初の引数にクラス参照が必要な の使用にあります。したがって、私の質問は、クラスオブジェクトの識別子を含む文字列からクラス オブジェクトを取得する方法があるかどうかです。Uploader'Uploader'

免責事項として、これらは私の正確なルートではなく、単なる例です. そしてもちろん、ここでも私の全体的なデザインに関してさらにコメントを歓迎します.

4

1 に答える 1

4

私はそれを行うには2つの一般的な方法があると思います. 以下の例を検討してください。

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
于 2013-07-03T10:48:56.867 に答える