Python:按名称访问另一类当前模块

Mar*_*tin 3 python

我在一个模块中进行了以下设置:

class A(object):
    # stuff

class B(object):
    # stuff
Run Code Online (Sandbox Code Playgroud)

现在我想要做的是,在里面创建一个按类A名称(我只是将类名作为字符串)的类实例B.我怎么能避免这个globals功能呢?

Thi*_*ter 6

为什么不用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.