国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

詳解Python中的動態屬性和特性

2020-02-22 23:37:59
字體:
來源:轉載
供稿:網友

導語:本文章記錄了本人在學習Python基礎之元編程篇的重點知識及個人心得,打算入門Python的朋友們可以來一起學習并交流。

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

屬性:在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]=value

3、使用特殊方法__new__

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 天柱县| 三都| 云霄县| 扎囊县| 大同县| 鲜城| 崇阳县| 莱阳市| 二手房| 化隆| 屏东县| 林西县| 松溪县| 东辽县| 中阳县| 无极县| 广平县| 济源市| 汉寿县| 临桂县| 滕州市| 古浪县| 唐河县| 馆陶县| 徐州市| 望江县| 利辛县| 绩溪县| 德安县| 西充县| 南昌县| 柏乡县| 海晏县| 班玛县| 京山县| 佛教| 唐山市| 霍州市| 南陵县| 吴江市| 海兴县|