python的metaclass淺析

高洛峰
發布: 2016-10-17 11:51:33
原創
955 人瀏覽過

元類別一般用於建立類別。在執行類別定義時,解釋器必須要知道這個類別的正確的元類別。解釋器會先尋找類別屬性__metaclass__,如果此屬性存在,就將這個屬性賦值給此類作為它的元類別。如果此屬性沒有定義,它會向上查找父類別中的__metaclass__.如果還沒有發現__metaclass__屬性,解釋器會檢查名字為__metaclass__的全域變數,如果它存在,就使用它作為元類別。否則, 這個類別就是一個傳統類別,並用 types.ClassType 作為此類的元類別。

在執行類別定義的時候,將檢查此類正確的(一般是預設的)元類別,元類別(通常)傳遞三個參數(到建構器): 類別名稱,從基底類別繼承資料的元組,和(類的)屬性字典。

元類別何時被創建?

#!/usr/bin/env python  
   
print '1. Metaclass declaration'  
class Meta(type):  
    def __init__(cls, name, bases, attrd):  
        super(Meta,cls).__init__(name,bases,attrd)  
        print '3. Create class %r' % (name)  
   
print '2. Class Foo declaration'  
class Foo(object):  
    __metaclass__=Meta  
    def __init__(self):  
        print '*. Init class %r' %(self.__class__.__name__)  
   
# 何问起 hovertree.com
print '4. Class Foo f1 instantiation'  
f1=Foo()  
   
print '5. Class Foo f2 instantiation'  
f2=Foo()  
   
print 'END'  
输出
登入後複製

結果:


1. Metaclass declaration

2. Class Foo declaration

3. Create class 'Foo'oo so

5. Class Foo f2 instantiation

*. Init class 'Foo'

END


以後,可見在類申明的時候,就執行了__metaclass的方法的物件後,可見在類別申明了時候,就只呼叫該類別的__init__()方法,MetaClass中的__init__()只在類別申明的時候執行了一次。


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!