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

首頁 > 編程 > Python > 正文

在Python中使用元類的教程

2020-02-23 00:55:12
字體:
來源:轉載
供稿:網友

type()

動態語言和靜態語言最大的不同,就是函數和類的定義,不是編譯時定義的,而是運行時動態創建的。

比方說我們要定義一個Hello的class,就寫一個hello.py模塊:

class Hello(object):  def hello(self, name='world'):    print('Hello, %s.' % name)

當Python解釋器載入hello模塊時,就會依次執行該模塊的所有語句,執行結果就是動態創建出一個Hello的class對象,測試如下:

>>> from hello import Hello>>> h = Hello()>>> h.hello()Hello, world.>>> print(type(Hello))<type 'type'>>>> print(type(h))<class 'hello.Hello'>

type()函數可以查看一個類型或變量的類型,Hello是一個class,它的類型就是type,而h是一個實例,它的類型就是class Hello。

我們說class的定義是運行時動態創建的,而創建class的方法就是使用type()函數。

type()函數既可以返回一個對象的類型,又可以創建出新的類型,比如,我們可以通過type()函數創建出Hello類,而無需通過class Hello(object)...的定義:

>>> def fn(self, name='world'): # 先定義函數...   print('Hello, %s.' % name)...>>> Hello = type('Hello', (object,), dict(hello=fn)) # 創建Hello class>>> h = Hello()>>> h.hello()Hello, world.>>> print(type(Hello))<type 'type'>>>> print(type(h))<class '__main__.Hello'>

要創建一個class對象,type()函數依次傳入3個參數:

        class的名稱;     繼承的父類集合,注意Python支持多重繼承,如果只有一個父類,別忘了tuple的單元素寫法;     class的方法名稱與函數綁定,這里我們把函數fn綁定到方法名hello上。

通過type()函數創建的類和直接寫class是完全一樣的,因為Python解釋器遇到class定義時,僅僅是掃描一下class定義的語法,然后調用type()函數創建出class。

正常情況下,我們都用class Xxx...來定義類,但是,type()函數也允許我們動態創建出類來,也就是說,動態語言本身支持運行期動態創建類,這和靜態語言有非常大的不同,要在靜態語言運行期創建類,必須構造源代碼字符串再調用編譯器,或者借助一些工具生成字節碼實現,本質上都是動態編譯,會非常復雜。
metaclass

除了使用type()動態創建類以外,要控制類的創建行為,還可以使用metaclass。

metaclass,直譯為元類,簡單的解釋就是:

當我們定義了類以后,就可以根據這個類創建出實例,所以:先定義類,然后創建實例。

但是如果我們想創建出類呢?那就必須根據metaclass創建出類,所以:先定義metaclass,然后創建類。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 芦溪县| 仙桃市| 阿克苏市| 任丘市| 东阿县| 化德县| 花垣县| 高青县| 嘉祥县| 金秀| 丰县| 安福县| 重庆市| 崇明县| 清流县| 新巴尔虎右旗| 犍为县| 松潘县| 德庆县| 沙洋县| 延吉市| 大埔区| 邵东县| 招远市| 永和县| 谢通门县| 醴陵市| 基隆市| 安丘市| 永新县| 黑水县| 黄大仙区| 册亨县| 延寿县| 宣城市| 襄樊市| 白城市| 自治县| 聂拉木县| 常山县| 怀集县|