通过元类来控制类的产生

写一个类来继承 type 以后这种类都叫元类

自定义元类来控制类的产生: 可以控制类名,可以控制类的继承父类,控制类的名称空间

如果你要自定义元类,就必须继承type

练习一:加限制 控制类名必须用sd开头

class My_class(type):
#     def __init__(self, *args, **kwargs):	# 目前不知道传什么参数,所用*args(接收所有位置实参),和**kwargs(接收所有的关键字实参)
#         print(args)
#         print(kwargs)
    def __init__(self, name, bases, dic):	# 这里必须用dic
        # self 现在就是Person类
        print(name)		# 这里的name就是class类名(Person)
        print(bases)
        print(dic)
        # 练习一:加限制  控制类名必须用sd开头			驼峰体
        if not name.startswith('sb'):
            raise Exception('类名没有以sb开头')
        
# metaclass=My_class	指定这个类生成的时候,用自己写的My_class这个元类
class Person(metaclass=My_class):		# 在Person类后面加metaclass=My_class的时候会调用My_class类的__init__
    school = 'FYZX'

    def __init__(self, name):
        self.name = name

    def score(self):
        print("分数为100")
       
p = Person()

练习二:类必须加注释

情景一: 注释不是空

class My_class(type):
    def __init__(self, name, bases, dic):
        print(self.__dict__['__doc__'])	# 两种方法都可以调用
        print(dic['__doc__'])
       
class Person(metaclass=My_class):
    '''
    我去,注释啊
    '''
    school = 'FYZX'

    def __init__(self, name):
        self.name = name

    def score(self):
        print("分数为100")
       
p = Person()

情景二: 注释为空;或没有注释

class My_class(type):
    def __init__(self, name, bases, dic):
        print(self.__dict__['__doc__'])	
        doc = self.__dict__['__doc__'].split()
        
        if not doc:
            # 没有加注释
            raise Exception('没有加注释')
     
class Person(metaclass=My_class):	# 在Person类的方法下用三个点('''''')才是方法的注释
    '''
    
    '''
    school = 'FYZX'

    def __init__(self, name):
        self.name = name

    def score(self):
        print("分数为100")
       
p = Person('nick')
posted @ 2023-10-30 11:22  hanyingshuo  阅读(10)  评论(0)    收藏  举报