metaclass 元类
一 元类
元类是类的类,是类的模板
元类是用来控制如何创建类的,正如类是创建对象的模板一样,而元类的主要目的是为了控制类的创建行为
元类的实例化的结果为我们用class定义的类,正如类的实例为对象(f1对象是Foo类的一个实例,Foo类是 type 类的一个实例)
type是python的一个内建元类,用来直接控制生成类,python中任何class定义的类其实都是type类实例化的对象
二 创建类的两种方式
方式一:使用class关键字
class A(object): pass print(type(A)) # <class 'type'>
方式二:手动模拟class创建类的过程
def run(self): print('%s is runing' % self.name) class_name = 'Bar' bases = (object,) class_dic = { 'x': 1, 'run': run } Bar = type(class_name, bases, class_dic) print(Bar) print(type(Bar))
参数格式:
type(class_name, bases, dic) 要动态创建一个class对象,type()函数依次传入3个参数: 1. class的名称,字符串形式; 2. 继承的父类集合,注意Python支持多重继承,如果只有一个父类,注意tuple的单元素写法; 3. {k:v} 或者 dict(k=v)
例一:
class Foo(object): class Meta: model = 'qwer' 由type创建: _meta = type('Meta',(object,),{'model':'qwer'}) Foo = type('Foo',(object,),{'Meta':'_meta'})
例二:
来个熟悉的:
class Hello(object): def hw(self, name='World'): print('Hello,%s' % name) h = Hello() h.hw() print(type(Hello)) print(type(h)) # 输出结果: ''' Hello,World <class 'type'> <class '__main__.Hello'> '''
再换个:
def func(self, name='World'): print('Hello,%s' % name) Hello = type('Hello', (object,), {'hw': func}) h = Hello() h.hw() print(type(Hello)) print(type(h)) # 数据结果: ''' Hello,World <class 'type'> <class '__main__.Hello'> ''' #注释:class的方法名称与函数绑定,这里我们把函数func绑定到方法名hw上。
三 自定义元类
class Mymeta(type): def __init__(self, class_name, class_bases, class_dic): pass def __call__(self, *args, **kwargs): # print('这里的self:',self) obj = self.__new__(self) self.__init__(obj, *args, **kwargs) return obj class Foo(metaclass=Mymeta): x = 123 def __init__(self, name): self.name = name def run(self): 'run function' print('runing') # print(Foo.__dict__) f = Foo('Tom') print(f.name)

浙公网安备 33010602011771号