Tôi nghĩ rằng tôi sẽ dành chút thời gian để chỉ cho bạn cách bạn có thể dịch một đối tượng để đọc chính tả dict(obj)
.
class A(object):
d = '4'
e = '5'
f = '6'
def __init__(self):
self.a = '1'
self.b = '2'
self.c = '3'
def __iter__(self):
# first start by grabbing the Class items
iters = dict((x,y) for x,y in A.__dict__.items() if x[:2] != '__')
# then update the class items with the instance items
iters.update(self.__dict__)
# now 'yield' through the items
for x,y in iters.items():
yield x,y
a = A()
print(dict(a))
# prints "{'a': '1', 'c': '3', 'b': '2', 'e': '5', 'd': '4', 'f': '6'}"
Phần quan trọng của mã này là __iter__
chức năng.
Như các ý kiến giải thích, điều đầu tiên chúng tôi làm là lấy các mục Class và ngăn chặn mọi thứ bắt đầu bằng '__'.
Khi bạn đã tạo điều đó dict
, sau đó bạn có thể sử dụng update
hàm dict và truyền vào ví dụ__dict__
.
Chúng sẽ cung cấp cho bạn một lớp hoàn chỉnh + từ điển ví dụ của các thành viên. Bây giờ tất cả những gì còn lại là lặp đi lặp lại chúng và mang lại lợi nhuận.
Ngoài ra, nếu bạn có kế hoạch sử dụng nó rất nhiều, bạn có thể tạo một trình @iterable
trang trí lớp.
def iterable(cls):
def iterfn(self):
iters = dict((x,y) for x,y in cls.__dict__.items() if x[:2] != '__')
iters.update(self.__dict__)
for x,y in iters.items():
yield x,y
cls.__iter__ = iterfn
return cls
@iterable
class B(object):
d = 'd'
e = 'e'
f = 'f'
def __init__(self):
self.a = 'a'
self.b = 'b'
self.c = 'c'
b = B()
print(dict(b))