創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!

小編給大家分享一下Python利用動(dòng)態(tài)屬性處理JSON數(shù)據(jù)源的方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
利用動(dòng)態(tài)屬性處理JSON數(shù)據(jù)源
屬性:在Python中,數(shù)據(jù)的屬性和處理數(shù)據(jù)的方法統(tǒng)稱屬性。
元編程:用元類進(jìn)行編程,元類→類→對(duì)象,元類比類更抽象,生成類的類。
1、使用動(dòng)態(tài)屬性訪問(wèn)JSON類數(shù)據(jù)
第一版:利用json.load(fp)審查數(shù)據(jù)
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) #如果需要下載就發(fā)出提醒。
with urlopen(URL) as remote, open(JSON, 'wb') as local: #在with語(yǔ)句中使用兩個(gè)上下文管理器分別用于讀取和保存遠(yuǎn)程文件。
local.write(remote.read())
with open(JSON) as fp:
return json.load(fp)#json.load函數(shù)解析JSON文件,返回Python原生對(duì)象。第二版:使用動(dòng)態(tài)屬性訪問(wèn)JSON類數(shù)據(jù)
第一版查閱深層數(shù)據(jù)的格式比較冗長(zhǎng),例如feed'Schedule'40,我們希望在讀取屬性上采用feed.Schedule.events[40].name這類方式來(lái)改進(jìn)。并且第二版的類能遞歸,自動(dòng)處理嵌套的映射和列表。
from collections import abc class FronenJSON(): def __init__(self,mapping): self.__data=dict(mapping)#創(chuàng)建副本,同時(shí)確保處理的是字典。 def __getattr__(self, name):#僅當(dāng)沒(méi)有指定名稱的屬性才調(diào)用__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)#創(chuàng)建FrozenJSON對(duì)象。 elif isinstance(obj,abc.MutableSequence): return [cls.build(item) for item in obj]#遞歸調(diào)用.build()方法,構(gòu)建一個(gè)列表。 else:#既不是字典也不是列表,則返回元素本身。 return obj
分析: FronenJSON類的關(guān)鍵是__getattr__方法。僅當(dāng)無(wú)法使用常規(guī)的方式獲取屬性(即在實(shí)例、類或超類中找不到指定的屬性),解釋器才會(huì)調(diào)用特殊的__getattr__方法。
2、處理無(wú)效屬性名
在Python中,由于關(guān)鍵字被保留,名稱為關(guān)鍵字的屬性是無(wú)效的。因此需要對(duì)第二版中的__init__進(jìn)行改進(jìn):
def __init__(self,mapping):
self.__data={}
for key,value in mapping.items():
if keyword.iskeyword(key):
key+='_'#與Python關(guān)鍵字重復(fù)的key在尾部加上下劃線。
self.__data[key]=value3、使用特殊方法__new__
第三版:使用__new__構(gòu)造方法把一個(gè)類轉(zhuǎn)換成一個(gè)靈活的對(duì)象工廠函數(shù)。
from collections import abc
class FronenJSON():
def __new__(cls, arg): # __new__是類方法,第一個(gè)參數(shù)是類本身cls。
if isinstance(arg, abc.Mapping):
return super().__new__(cls) #委托給超類object基類的__new__方法處理。
elif isinstance(arg, abc.MutableSequence): # 余下方法與原先的build方法一致。
return [cls(item) for item in arg]
else:
return arg
def __init__(self,mapping):
self.__data={}
for key,value in mapping.items():
if keyword.iskeyword(key):
key+='_'
self.__data[key]=value
def __getattr__(self, name):
if hasattr(self,name):
return getattr(self.__data,name)
else:
return FronenJSON(self.__data[name])看完了這篇文章,相信你對(duì)Python利用動(dòng)態(tài)屬性處理JSON數(shù)據(jù)源的方法有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝各位的閱讀!
網(wǎng)站欄目:Python利用動(dòng)態(tài)屬性處理JSON數(shù)據(jù)源的方法-創(chuàng)新互聯(lián)
分享URL:http://chinadenli.net/article24/cdogje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、網(wǎng)站策劃、電子商務(wù)、ChatGPT、網(wǎng)站營(yíng)銷、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容