導語:本文章記錄了本人在學習Python基礎之元編程篇的重點知識及個人心得,打算入門Python的朋友們可以來一起學習并交流。
屬性:在Python中,數據的屬性和處理數據的方法統稱屬性。
元編程:用元類進行編程,元類→類→對象,元類比類更抽象,生成類的類。
1、使用動態屬性訪問JSON類數據
第一版:利用json.load(fp)審查數據
from urllib.request import urlopenimport warningsimport osimport jsonURL = '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這類方式來改進。并且第二版的類能遞歸,自動處理嵌套的映射和列表。
from collections import abcclass 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(item) for item in obj]#遞歸調用.build()方法,構建一個列表。 else:#既不是字典也不是列表,則返回元素本身。 return obj
分析: FronenJSON類的關鍵是__getattr__方法。僅當無法使用常規的方式獲取屬性(即在實例、類或超類中找不到指定的屬性),解釋器才會調用特殊的__getattr__方法。
2、處理無效屬性名
在Python中,由于關鍵字被保留,名稱為關鍵字的屬性是無效的。因此需要對第二版中的__init__進行改進:
def __init__(self,mapping): self.__data={} for key,value in mapping.items(): if keyword.iskeyword(key): key+='_'#與Python關鍵字重復的key在尾部加上下劃線。 self.__data[key]=value3、使用特殊方法__new__
第三版:使用__new__構造方法把一個類轉換成一個靈活的對象工廠函數。
新聞熱點
疑難解答