将Python对象转换成字典
看到了一个将Python中的对象转换成字典的小技巧. 通过调用内置函数vars()将类的实例对象映射成字典. 可以进一步用来生成json格式的字符串等.
·
看到了一个将Python中的对象转换成字典的方法.
class TestClass:
def __init__(self):
self.a = 1
self.b = 2
这里我们定义一个类TestClass
, 它有两个属性a
和b
.
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__
方法可以拓展字典的转换方法.
更多推荐
已为社区贡献2条内容
所有评论(0)