亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python利用動態屬性處理JSON數據源的方法

發布時間:2020-08-07 13:44:40 來源:億速云 閱讀:194 作者:小新 欄目:編程語言

小編給大家分享一下Python利用動態屬性處理JSON數據源的方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

利用動態屬性處理JSON數據源

屬性:在Python中,數據的屬性和處理數據的方法統稱屬性。

元編程:用元類進行編程,元類→類→對象,元類比類更抽象,生成類的類。

1、使用動態屬性訪問JSON類數據

第一版:利用json.load(fp)審查數據

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這類方式來改進。并且第二版的類能遞歸,自動處理嵌套的映射和列表。

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(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]=value

3、使用特殊方法__new__

第三版:使用__new__構造方法把一個類轉換成一個靈活的對象工廠函數。

from collections import abc
 
class FronenJSON():
  def __new__(cls, arg): # __new__是類方法,第一個參數是類本身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])

看完了這篇文章,相信你對Python利用動態屬性處理JSON數據源的方法有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大连市| 土默特左旗| 霍城县| 公安县| 全州县| 定陶县| 柳州市| 栖霞市| 阿图什市| 宜兴市| 武义县| 东丰县| 化德县| 汉中市| 大田县| 北川| 东安县| 花莲县| 紫云| 天台县| 云霄县| 招远市| 益阳市| 江门市| 彭山县| 台东县| 镇巴县| 纳雍县| 江油市| 衢州市| 临漳县| 西青区| 曲靖市| 苏州市| 甘德县| 怀化市| 密云县| 江门市| 台东县| 车致| 天等县|