日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
      軟件
      軟件
      文章
      搜索

      首頁業(yè)內(nèi)動(dòng)態(tài) 業(yè)內(nèi)資訊 → Python基礎(chǔ)教程:元類

      Python基礎(chǔ)教程:元類

      相關(guān)軟件相關(guān)文章發(fā)表評論 來源:西西整理時(shí)間:2013/11/6 1:22:25字體大。A-A+

      作者:西西點(diǎn)擊:16次評論:0次標(biāo)簽: Python基礎(chǔ)教程

      一、概述

      Python雖然是多范式的編程語言,但它的數(shù)據(jù)模型卻是 純面向?qū)ο?/strong> 的。與那些僅在語法層面聲稱純OO的編程語言(如Java)相比,Python的這種純粹性更加深入骨髓。

      在Python的世界里,一切皆為對象:數(shù)值、序列、字典、函數(shù)、模塊、文件、類、類實(shí)例 等等,無一例外(參考 Data model)。其中,“類也是對象” 的概念最讓人匪夷所思,這完全超越了傳統(tǒng)的OO思想。

      元類(metaclass)是Python 2.2中引入的概念,利用元類可以 定制類的創(chuàng)建行為(Customizing class creation)!霸悺 的概念同樣讓人難以理解,然而理解 “元類” 是理解 “類也是對象” 的關(guān)鍵。

      二、經(jīng)典闡述

      對于元類的理解,目前為止,最經(jīng)典的闡述莫過于Stack Overflow上面的這篇帖子 What is a metaclass in Python?,e-satis 神一般的回復(fù)讓人醍醐灌頂,看完后基本就了然于胸了。

      如果覺得看英文比較吃力,這里有一篇中文譯版 深刻理解Python中的元類(metaclass)(注:英文原版最近有更新,但核心內(nèi)容不變)。

      三、核心總結(jié)

      1、類的創(chuàng)建過程

      對于類定義:

      class Foo(Base):
          def say(self):
              print 'hello'
      

      Python解釋器 執(zhí)行class語句 時(shí),處理步驟如下:

      確定元類mcls。元類的查找優(yōu)先級為:

      首先查找 類Foo 是否擁有屬性__metaclass__

      否則查找 類Foo的父類 是否具有屬性__metaclass__

      否則查找 類Foo所在模塊 是否具有全局變量__metaclass__

      否則使用默認(rèn)元類(經(jīng)典類:types.ClassType;新式類:type)

      使用元類mcls創(chuàng)建類Foo。創(chuàng)建語意等價(jià)于:

      def say(self):
          print 'hello'
      
      # 元類的參數(shù):mcls(name, bases, dict)
      Foo = mcls('Foo', (Base,), {'say': say})
      

      創(chuàng)建成功后,類Foo 是 元類mcls 的 實(shí)例。

      綜上:創(chuàng)建類 其實(shí)是一種更高級別的 實(shí)例化過程,本質(zhì)上與 創(chuàng)建類實(shí)例 相似。

      實(shí)例化過程實(shí)例語意形式
      創(chuàng)建類Foo元類mcls類Fooclass Foo: pass <=> Foo = mcls('Foo', (), {})
      創(chuàng)建類實(shí)例foo類Foo實(shí)例foofoo = Foo()

      2、元類的使用慣例

      原則上,元類可以是:任何接受參數(shù) name, bases, dict 并返回 類 的 可調(diào)用對象(參考 metaclass)。

      例如元類可以是 函數(shù)

      def metacls_func(name, bases, dict):
          # do customizing here
          return type(name, bases, dict)
      

      根據(jù)最佳實(shí)踐指導(dǎo),更好的習(xí)慣是使用  作為元類,典型風(fēng)格如下:

      class MetaCls(type):
          def __new__(cls, name, bases, dict):
              # do customizing here
              return super(MetaCls, cls).__new__(cls, name, bases, dict)
      

      注意:

      元類可以繼承自另一個(gè)元類,也可以使用其他元類

      除了常用的__new__,還可以借助__init__和__call__來定制被創(chuàng)建的類

      四、簡單案例

      1、默認(rèn)行為

      1)經(jīng)典類(Classic classes)

      類Old的三種等價(jià)定義:

      class Old: pass
      
      class Old:
          __metaclass__ = types.ClassType
      
      Old = types.ClassType('Old', (), {})
      

      類Old是元類types.ClassType的實(shí)例:

      >>> isinstance(Old, types.ClassType)
      True
      

      2)新式類(New-style classes)

      類New的三種等價(jià)定義:

      class New(object): pass
      
      class New:
          __metaclass__ = type
      
      New = type('New', (), {})
      

      類New是元類type的實(shí)例:

      >>> isinstance(New, type)
      True
      

      2、使用元類

      為所有類打上作者標(biāo)簽:

      class AuthorTag(type):
          def __new__(cls, name, bases, dict):
              dict['__author__'] = 'RussellLuo'
              return super(AuthorTag, cls).__new__(cls, name, bases, dict)
      
      class MyBlog:
          __metaclass__ = AuthorTag
      
      class MyGitHub:
          __metaclass__ = AuthorTag
      

      現(xiàn)在,類MyBlog和類MyGitHub都免費(fèi)獲得了作者簽名:

      >>> MyBlog.__author__
      'RussellLuo'
      >>> MyGitHub.__author__
      'RussellLuo'
      

      五、實(shí)踐為王

      請記住上面的簡單案例,如果您想從本文中獲得對Python元類僅有的一點(diǎn)印象。紙上得來終覺淺,絕知此事要躬行,開始吧。

        相關(guān)評論

        閱讀本文后您有什么感想? 已有人給出評價(jià)!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過難過
        • 5 囧
        • 3 圍觀圍觀
        • 2 無聊無聊

        熱門評論

        最新評論

        發(fā)表評論 查看所有評論(0)

        昵稱:
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)