元類

一、創建類的2中方式

1、用class創建類

python是動態語言,函數和類的定義,是運行時動態創建的。
靜態語言是編譯時定義的,如java

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

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


type()函數可以查看一個類型或變量的類型

Hello是一個class,它的類型就是type

h是一個實例,它的類型就是class Hello

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

所有class創建的類的元類都是 type

2、type創建類

def fun(self):#和類中創建方法一樣self不可少
    print('我是type創建類中的方法')

Fun=type('Fun',(object,),dict(hello=fun))
h=Fun()#實例化
h.hello()      #我是type創建類中的方法
print(type(Fun))    #<class 'type'>
print(type(h))  #<class '__main__.Fun'>

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

第一個參數:class的名稱, 字符串格式;
第二個參數:繼承的父類集合,注意Python支持多重繼承,格式是元組。
第三個參數:class的方法名稱與函數綁定,這裏我們把函數fun綁定到方法名hello上,字典格式。

二、元類

1、什麼是 metaclass

在python中的任何東西都是對象。包括int,str,function,class等。他們都是從一個class 創建的,我們可以通過查看 class 屬性來檢查

age = 35
print(age.__class__)   #<type 'int'>

name = 'bob'
print(name.__class__)  #<type 'str'>

def foo():
    pass
print(foo.__class__) #<type 'function'>

class Bar(object):
    pass
b = Bar()
print(b.__class__)   #<class '__main__.Bar'>

檢查__class__屬性

a.__class__.__class__
#<type 'type'>
age.__class__.__class__
#<type 'type'>
foo.__class__.__class__
#<type 'type'>
b.__class__.__class__
#<type 'type'>

結論: type 就是python內置的一個metaclass

2、metaclass 屬性

class Foo(object):
 __metaclass__ = something...

創建一個類,python 將會如下去解析:

是否有__metaclass__ 在Foo 裏面,如果是的,則用metaclass 去創建一個名字爲 ”Foo" 的class object. ;如果沒有找到,則看其基類Bar裏面是否有__metaclass__;如果基類沒有,則看所在的module 層是否有__metaclass__;如果都沒有的話,則調用 type 去創建這個類。

3、自定義 metaclass

待續中

發佈了183 篇原創文章 · 獲贊 6 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章