添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
引言:最近在做项目时候遇到了一个问题---->'根据不同传值,获取不同的模块类以及序列化类'。

最开始是通过 多个if语句 进行实现代码的,但是因为if语句比较多,看着 不优雅 ,于是就想着把不同的值放到字典中并通过 键值对 的形式进行存储,但是有一个问题就是, 字典中的value类型是字符串,需要转换成类。

    class A:
        print('i am A')
    class As:
        print('i am As')
    class B:
    class Bs:
    dic = {'a': 'A_As', 'b': 'B_Bs'}

经查找资料发现pythonglobals()[字符串] 可以将一个字符串转换成类。(该转换指将和类名一样的字符串转换成类,比如'A'转成A类型)(是通过字符串形式的类名获取相应的类)于是我就去看了看globals()的用法

def globals(*args, **kwargs): # real signature unknown
    Return the dictionary containing the current scope's global variables.
    NOTE: Updates to this dictionary *will* affect name lookups in the current
    global scope and vice-versa.

该注释的意思是以字典的形式返回当前的所有对象.

测试并解决问题

接下来我们print一下globals()看看返回什么值。

    print(globals())
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000020B614BEC48>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/python_projects/test.py', '__cached__': None, 'Decimal': <class 'decimal.Decimal'>, 'A': <class '__main__.A'>, 'As': <class '__main__.As'>, 'B': <class '__main__.B'>, 'Bs': <class '__main__.Bs'>, 'dic': {'a': 'A_As', 'b': 'B_Bs'}}

可以看见得到这一大串,接着我们可以看见当前的所有对象都包括在了这个字典中了,接着我们就可以通过globals()[字符串]进行获取我们想要的类了。

a = globals()[dic['a'].split('_')[0]]
# i am A

完整测试代码:

if __name__ == '__main__':
    class A:
        print('i am A')
    class As:
        print('i am As')
    class B:
    class Bs:
    dic = {'a': 'A_As', 'b': 'B_Bs'}
    print(globals())
    a = globals()[dic['a'].split('_')[0]]
    是xiuxi休息啊
       
粉丝