yamx

定制元类来控制类的产生之__init__

# 如何自定义元类来控制类的产生

# 自定义的类的元类属性即便不写 也默认为type

class Test(metaclass=type):

    pass


# 如果想用自定义的元类来产生类,将该metaclass赋值为定制的元类名即可


# 自定义元类:

# 只有继承了type类的类才是元类

class Mymeta(type):

    pass


# 调用元类产生类会发生的三件事:(与调用类产生对象的步骤一致)

# 1、先生成一个空对象

# 2、调用元类下的__init__方法,完成初始化对象的操作

# 3、返回一个初始化好的对象


定制元类来控制类的产生,实际上就控制着class机制的第四个步骤(通过元类来创建类)

案例:

定制元类来控制类名首字母必须大写,类体内必须有文档,否则报错,无法创建类 

class Mymeta(type):

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

        if not class_name.istitle():

            raise NameError('类名首字母必须大写!')

        if not class_dic.get('__doc__'):

            raise TypeError('类体内必须有文档注释')


class Test(metaclass=Mymeta):

    pass

# TypeError: 类体内必须有文档注释

评论

© yamx | Powered by LOFTER