日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
創(chuàng)新互聯(lián)Python教程:Python如何利用動(dòng)態(tài)屬性處理JSON數(shù)據(jù)源

祁連ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!

利用動(dòng)態(tài)屬性處理JSON數(shù)據(jù)源

屬性:在python中,數(shù)據(jù)的屬性和處理數(shù)據(jù)的方法統(tǒng)稱屬性。

元編程:用元類進(jìn)行編程,元類→類→對(duì)象,元類比類更抽象,生成類的類。

1、使用動(dòng)態(tài)屬性訪問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語句中使用兩個(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)屬性訪問JSON類數(shù)據(jù)

第一版查閱深層數(shù)據(jù)的格式比較冗長(zhǎng),例如feed'Schedule'40,我們希望在讀取屬性上采用feed.Schedule.events[40].name這類方式來改進(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)沒有指定名稱的屬性才調(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)無法使用常規(guī)的方式獲取屬性(即在實(shí)例、類或超類中找不到指定的屬性),解釋器才會(huì)調(diào)用特殊的__getattr__方法。

相關(guān)推薦:《Python視頻教程》

2、處理無效屬性名

在Python中,由于關(guān)鍵字被保留,名稱為關(guān)鍵字的屬性是無效的。因此需要對(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]=value

3、使用特殊方法__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])

當(dāng)前標(biāo)題:創(chuàng)新互聯(lián)Python教程:Python如何利用動(dòng)態(tài)屬性處理JSON數(shù)據(jù)源
標(biāo)題網(wǎng)址:http://www.5511xx.com/article/cdoohco.html