写一个类来继承 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')
标签:__,控制,name,产生,self,元类,Person,print,class
From: https://www.cnblogs.com/hanyingshuo/p/17797372.html