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

猜你喜欢

转载自www.cnblogs.com/yanxiatingyu/p/9264986.html