将Python对象转换成字典

看到了一个将Python中的对象转换成字典的方法.

class TestClass:
   def __init__(self):
       self.a = 1
       self.b = 2

这里我们定义一个类TestClass, 它有两个属性ab.

tc = TestClass()
print(tc.a) # 1
print(tc.b) # 2

tc是类TestClass的一个实现, 也是一个对象. 我们调用它的属性时, 需要这样写: tc.a, tc.b.

而使用Python的内置函数vars就可以将一个对象映射成字典类型:

tc_dict = vars(tc)
print(tc_dict) # {'a': 1, 'b': 2}
print(tc_dict['a'], tc_dict['b']) # 1 2

这样做的用处之一, 是可以将对象的属性打印成json格式的字符串, 方便存储成日志文件.

import json
json.dumps(tc_dict) # '{"a": 1, "b": 2}'

注意, vars函数在映射类的实例时, 只能映射其实例变量(instance variable), 即在__init__方法中初始化的变量. 与之对应的类变量(class variable), 即在类下直接设置的变量则不会被映射到. 这里给出一个例子:

class TestClass:
    c = 3 # class variable
    def __init__(self):
        self.a = 1 # instance variable
        self.b = 2 # instance variable
tc = TestClass()
print(vars(tc)) # 映射到的字典中没有关键字 'c' 
# {'a': 1, 'b': 2}

# 映射类的'type'对象
print(vars(TestClass)) # 映射到的字典中没有实例变量的关键字 'a', 'b', 但是有类变量 'c'
# {'__module__': '__main__', 'c': 3, '__init__': <function TestClass.__init__ at 0x7f3a476f4b70>, '__dict__': <attribute '__dict__' of 'TestClass' objects>, '__weakref__': <attribute '__weakref__' of 'TestClass' objects>, '__doc__': None}

这里插一句题外话, 也可以通过修改类的__repr__或者__str__属性, 来获得更加灵活的输出格式.

class TestClass:
    def __init__(self):
        self.a = 1
        self.b = 2
    def __repr__(self):
        return f"{
     
     {'a' : {
      
      self.a}, 'b' : {
      
      self.b}}}"
tc = TestClass()
print(tc) # {'a' : 1, 'b' : 2}

一点想法: 通过重写类中的__dict__方法可以拓展字典的转换方法.

猜你喜欢

转载自blog.csdn.net/weixin_41231535/article/details/124993472