引言:最近在做项目时候遇到了一个问题---->'根据不同传值,获取不同的模块类以及序列化类'。
最开始是通过
多个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'}
经查找资料发现python
中 globals()[字符串]
可以将一个字符串转换成类。(该转换指将和类名一样的字符串转换成类,比如'A'转成A类型)(是通过字符串形式的类名获取相应的类)于是我就去看了看globals()的用法
def globals(*args, **kwargs):
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]]
完整测试代码:
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休息啊
粉丝