我在一个模块中进行了以下设置:
class A(object):
# stuff
class B(object):
# stuff
Run Code Online (Sandbox Code Playgroud)
现在我想要做的是,在里面创建一个按类A名称(我只是将类名作为字符串)的类实例B.我怎么能避免这个globals功能呢?
为什么不用A?或者你只有一个字符串'A'?如果是,那globals()['A']就是要走的路.替代方案getattr(sys.modules[__name__], 'A')但显然globals()更合适.
>>> dis.dis(lambda: getattr(sys.modules[__name__], 'Foo'))
1 0 LOAD_GLOBAL 0 (getattr)
3 LOAD_GLOBAL 1 (sys)
6 LOAD_ATTR 2 (modules)
9 LOAD_GLOBAL 3 (__name__)
12 BINARY_SUBSCR
13 LOAD_CONST 1 ('Foo')
16 CALL_FUNCTION 2
19 RETURN_VALUE
>>> dis.dis(lambda: globals()['Foo'])
1 0 LOAD_GLOBAL 0 (globals)
3 CALL_FUNCTION 0
6 LOAD_CONST 1 ('Foo')
9 BINARY_SUBSCR
10 RETURN_VALUE
>>> dis.dis(lambda: Foo)
1 0 LOAD_GLOBAL 0 (Foo)
3 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)
因此,通过查看用于访问的各种方法的指令Foo,使用globals()很可能比通过更快sys.modules.