导语:本文章记录了本人在学习Python基础之元编程篇的重点知识及个人心得,打算入门Python的朋友们可以来一起学习并交流。
一、利用动态属性处理JSON数据源
属性:在Python中,数据的属性和处理数据的方法统称属性。
元编程:用元类进行编程,元类→类→对象,元类比类更抽象,生成类的类。
1、使用动态属性访问JSON类数据
第一版:利用json.load(fp)审查数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
from urllib.request import urlopen import warnings import os import json URL = 'http://www.oreilly.com/pub/sc/osconfeed' JSON = 'data/osconfeed.json' def load(): if not os.path.exists(JSON): msg = 'downloading {} to {}' . format (URL, JSON) warnings.warn(msg) #如果需要下载就发出提醒。 with urlopen(URL) as remote, open (JSON, 'wb' ) as local: #在with语句中使用两个上下文管理器分别用于读取和保存远程文件。 local.write(remote.read()) with open (JSON) as fp: return json.load(fp) #json.load函数解析JSON文件,返回Python原生对象。 |
第二版:使用动态属性访问JSON类数据
第一版查阅深层数据的格式比较冗长,例如feed'Schedule'40,我们希望在读取属性上采用feed.Schedule.events[40].name这类方式来改进。并且第二版的类能递归,自动处理嵌套的映射和列表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
from collections import abc class FronenJSON(): def __init__( self ,mapping): self .__data = dict (mapping) #创建副本,同时确保处理的是字典。 def __getattr__( self , name): #仅当没有指定名称的属性才调用__getattr__方法。 if hasattr ( self ,name): return getattr ( self .__data,name) else : return FronenJSON.build( self .__data[name]) @classmethod def __build__( cls ,obj): if isinstance (obj,abc.Mapping): #判断obj是否是映射。 return cls (obj) #创建FrozenJSON对象。 elif isinstance (obj,abc.MutableSequence): return [ cls .build(
|