一、創建類的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
待續中