type()
函數(shù)既可以返回一個對象的類型闹司,又可以創(chuàng)建出新的類型的畴。
def fn(self, name='world'):
print('hello, %s.' % name)
Hello = type('Hello', (object,), dict(hello=fn))
'''
param name: 類的名稱
param bases: 類繼承的父類集合
param dict: class的方法名稱與函數(shù)綁定
'''
通過type()
函數(shù)創(chuàng)建的類和直接寫class是完全一樣的灰嫉,因為Python解釋器遇到class定義時扼倘,僅僅是掃描一下class定義的語法,然后調用type()
函數(shù)創(chuàng)建出class需五。
metaclass
除了使用type()
動態(tài)創(chuàng)建類以外鹉动,要控制類的創(chuàng)建行為,還可以使用metaclass宏邮。
先定義metaclass泽示,就可以創(chuàng)建類,最后創(chuàng)建實例蜜氨。
'''
param cls: 當前準備創(chuàng)建的類的對象械筛;
param name: 類的名字;
param bases: 類繼承的父類集合飒炎;
param attrs: 類的方法集合埋哟。
'''
class ListMetaclass(type):
def __new__(cls, name, bases, attrs):
attrs['add'] = lambda self, value: self.append(value)
return type.__new__(cls, name, bases, attrs)
class Mylist(list, metaclass=ListMetaclass):
pass
>>> L = MyList()
>>> L.add(1)
>> L
[1]