<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      Fork me on GitHub

      Python深入03 對象的屬性

      作者:Vamei 出處:http://www.rzrgm.cn/vamei 歡迎轉載,也請保留這段聲明。謝謝!

       

      Python一切皆對象(object),每個對象都可能有多個屬性(attribute)。Python的屬性有一套統一的管理方案。

       

      屬性的__dict__系統

      對象的屬性可能來自于其類定義,叫做類屬性(class attribute)。類屬性可能來自類定義自身,也可能根據類定義繼承來的。一個對象的屬性還可能是該對象實例定義的,叫做對象屬性(object attribute)。

      對象的屬性儲存在對象的__dict__屬性中。__dict__為一個詞典,鍵為屬性名,對應的值為屬性本身。我們看下面的類和對象。chicken類繼承自bird類,而summer為chicken類的一個對象。

      class bird(object):
          feather = True
      
      class chicken(bird):
          fly = False
          def __init__(self, age):
              self.age = age
      
      summer = chicken(2)
      
      print(bird.__dict__)
      print(chicken.__dict__)
      print(summer.__dict__)

       

      下面為我們的輸出結果:

      {'__dict__': <attribute '__dict__' of 'bird' objects>, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'bird' objects>, 'feather': True, '__doc__': None}
      
      
      {'fly': False, '__module__': '__main__', '__doc__': None, '__init__': <function __init__ at 0x2b91db476d70>}
      
      
      {'age': 2}

       

      第一行為bird類的屬性,比如feather。第二行為chicken類的屬性,比如fly和__init__方法。第三行為summer對象的屬性,也就是age。有一些屬性,比如__doc__,并不是由我們定義的,而是由Python自動生成。此外,bird類也有父類,是object類(正如我們的bird定義,class bird(object))。這個object類是Python中所有類的父類。

      可以看到,Python中的屬性是分層定義的,比如這里分為object/bird/chicken/summer這四層。當我們需要調用某個屬性的時候,Python會一層層向上遍歷,直到找到那個屬性。(某個屬性可能出現再不同的層被重復定義,Python向上的過程中,會選取先遇到的那一個,也就是比較低層的屬性定義)。

      當我們有一個summer對象的時候,分別查詢summer對象、chicken類、bird類以及object類的屬性,就可以知道summer對象所有的__dict__,就可以找到通過對象summer可以調用和修改的所有屬性了。下面兩種屬性修改方法等效:

      summer.__dict__['age'] = 3
      print(summer.__dict__['age'])
      
      summer.age = 5
      print(summer.age)

       

       (上面的情況中,我們已經知道了summer對象的類為chicken,而chicken類的父類為bird。如果只有一個對象,而不知道它的類以及其他信息的時候,我們可以利用__class__屬性找到對象的類,然后調用類的__base__屬性來查詢父類)

       

      特性

      同一個對象的不同屬性之間可能存在依賴關系。當某個屬性被修改時,我們希望依賴于該屬性的其他屬性也同時變化。這時,我們不能通過__dict__的方式來靜態的儲存屬性。Python提供了多種即時生成屬性的方法。其中一種稱為特性(property)。特性是特殊的屬性。比如我們為chicken類增加一個特性adult。當對象的age超過1時,adult為True;否則為False:

      class bird(object):
          feather = True
      
      class chicken(bird):
          fly = False
          def __init__(self, age):
              self.age = age
          def getAdult(self):
              if self.age > 1.0: return True
              else: return False
          adult = property(getAdult)   # property is built-in
      
      summer = chicken(2)
      
      print(summer.adult)
      summer.age = 0.5
      print(summer.adult)

       

      特性使用內置函數property()來創建。property()最多可以加載四個參數。前三個參數為函數,分別用于處理查詢特性、修改特性、刪除特性。最后一個參數為特性的文檔,可以為一個字符串,起說明作用。

       

      我們使用下面一個例子進一步說明:

      class num(object):
          def __init__(self, value):
              self.value = value
          def getNeg(self):
              return -self.value
          def setNeg(self, value):
              self.value = -value
          def delNeg(self):
              print("value also deleted")
              del self.value
          neg = property(getNeg, setNeg, delNeg, "I'm negative")
      
      x = num(1.1)
      print(x.neg)
      x.neg = -22
      print(x.value)
      print(num.neg.__doc__)
      del x.neg

       

      上面的num為一個數字,而neg為一個特性,用來表示數字的負數。當一個數字確定的時候,它的負數總是確定的;而當我們修改一個數的負數時,它本身的值也應該變化。這兩點由getNeg和setNeg來實現。而delNeg表示的是,如果刪除特性neg,那么應該執行的操作是刪除屬性value。property()的最后一個參數("I'm negative")為特性negative的說明文檔。

       

      使用特殊方法__getattr__

      我們可以用__getattr__(self, name)來查詢即時生成的屬性。當我們查詢一個屬性時,如果通過__dict__方法無法找到該屬性,那么Python會調用對象的__getattr__方法,來即時生成該屬性。比如:

      class bird(object):
          feather = True
      
      class chicken(bird):
          fly = False
          def __init__(self, age):
              self.age = age
          def __getattr__(self, name):
              if name == 'adult':
                  if self.age > 1.0: return True
                  else: return False
              else: raise AttributeError(name)
      
      summer = chicken(2)
      
      print(summer.adult)
      summer.age = 0.5
      print(summer.adult)
      
      print(summer.male)

       

      每個特性需要有自己的處理函數,而__getattr__可以將所有的即時生成屬性放在同一個函數中處理。__getattr__可以根據函數名區別處理不同的屬性。比如上面我們查詢屬性名male的時候,raise AttributeError。

      (Python中還有一個__getattribute__特殊方法,用于查詢任意屬性。__getattr__只能用來查詢不在__dict__系統中的屬性)

      __setattr__(self, name, value)和__delattr__(self, name)可用于修改和刪除屬性。它們的應用面更廣,可用于任意屬性。

       

      即時生成屬性的其他方式

      即時生成屬性還可以使用其他的方式,比如descriptor(descriptor類實際上是property()函數的底層,property()實際上創建了一個該類的對象)。有興趣可以進一步查閱。

       

      總結

      __dict__分層存儲屬性。每一層的__dict__只存儲該層新增的屬性。子類不需要重復存儲父類中的屬性。

      即時生成屬性是值得了解的概念。在Python開發中,你有可能使用這種方法來更合理的管理對象的屬性。

       

      posted @ 2012-12-11 22:16  Vamei  閱讀(56800)  評論(28)    收藏  舉報
      主站蜘蛛池模板: 台东县| 亚洲综合在线日韩av| 中国熟女仑乱hd| 夜夜添狠狠添高潮出水| 亚洲最大成人免费av| 国产精品无码成人午夜电影| 起碰免费公开97在线视频| 国产亚洲综合区成人国产| 91在线国内在线播放老师| 国产睡熟迷奷系列网站| 日本在线a一区视频高清视频| 久久精品国产99国产精品严洲| 国产麻花豆剧传媒精品mv在线| 国产午夜视频在线观看| 亚洲熟妇熟女久久精品综合| 久久中文字幕无码一区二区| 美女一区二区三区亚洲麻豆| 蜜桃av亚洲精品一区二区| 伊人久久精品无码麻豆一区| 南部县| 色二av手机版在线| 九九热在线视频观看这里只有精品| 亚洲国产精品综合久久2007| AV秘 无码一区二| 波多野结衣久久一区二区| 日韩av片无码一区二区不卡 | 人妻影音先锋啪啪AV资源| 亚洲熟女精品一区二区| 激情伊人五月天久久综合| 人妻少妇精品中文字幕| 精品久久久久中文字幕日本| 99久久精品国产一区色| 国产成人8X人网站视频| 榕江县| 日韩中文字幕v亚洲中文字幕| 在线播放免费人成毛片| 国产免费无遮挡吃奶视频| 国产在线无码不卡播放| 永久免费无码国产| 日本一道一区二区视频| 亚洲男人天堂东京热加勒比|