python 面向对象编程 之 元类

元类是类的类,使我们自定义的类,即我们用class定义类本质就是元类,是类的模板

四步走:

一:控制class定义类的过程

1.先拿到类名

2.在拿到基类

3.执行类体代码,得到名称空间的dict

4.调用元类将三个参数传递进去

#其实class 是上面四步的封装。(隔离了复杂度)

二:自定义元类

class Mymeta(type):

  def __init__(self,class_name,class_base,class_dic):

    super().__init__(class_name,class_base,class_dic)

class My(object,metaclass=Mymeta):

  pass

三:控制类与对象的产生

class Bar:

    def __call__(self, *args, **kwargs):        print(self)        print(args)        print(kwargs)

bar = Bar()bar('test')#对象后面加括号触发

class Mymeta(type):    def __init__(self, class_name, class_base, class_dic):        '''        :param class_name: 类名        :param class_base: 基类        :param class_dic: 名称空间        '''        if not class_name.istitle():            raise ValueError('类名需要大小写')

        if class_dic.get('__doc__'):            content = class_dic.get('__doc__')            content = content.replace(' ', '')            content = content.replace('\n', '')            if len(content)==0:                raise ValueError('类不能没有注释')    if '__doc__' not in class_dic or not clas_dic.get('__doc__').strip():        raise TypeError('必须为类指定文档注释')

        super(Mymeta, self).__new__(class_name, class_name, class_dic)

class Mysql:    '''    '''    def __init__(self, Host, Port):        self.Host = Host        self.Port = Port

#创建类的两种方式

方式一:、

  使用class关键字

class People(object):

  

  def talk(self):

    print('你好')

  def walk(self):

    print('走路')

方式二:

  手动模拟class创建类的过程:将创建类的步骤拆分来,手动去创建、

手动创建需要三个条件,

需要分别拿到

1.类名

2.类的父类

3.类体(执行后得到名称空间的dict)

class_name=People

class_base=object

class_body= '''  #类体

  def talk(self):

    print('你好')

  def walk(self):

    print('走路')

'''

cla=2wss_dic={}

步骤一(先处理类体->名称空间):类体定义的名字都会存放于类的名称空间中(一个局部的名称空间),我们可以事先定义一个空字典,然后用exec去执行类体代码

(exec产生名称空间的过程与真正的class过程类似,只是后者会将_开头的属性变形,生成类的局部名称空间,即填充字典)

exec(class_body,globals,class_dic)

步骤二:

People=type(class_name,class_base,class_dic)

#实例化type得到对象Foo,即我们得到对象People,即我们用class定义的类People

一个没有显示的声明自己的元类,默认继承的就是type

  

88

上一篇:redis实现分布式可重入锁


下一篇:python面向对象编程进阶