一、引导
class Demo: def func(self): pass obj = Demo() print(type(obj)) print(type(Demo)) # Demo = type() # 所有你写的类默认情况下都是type产生的 # 产生的类称之为 元类!! 即type就是元类 # 类的三大特征: 1.类名 2.父类 3.类的名称空间
eval与exec
res = """ print('555') """ res2 = """ for i in range(5): print(i) """ eval(res) # 555 exec(res) # 555 eval(res2) # 报错 exec(res2) # 1 2 3 4 5 # 从上面执行的结果可以得知: # eval与exec都可以识别字符串中代码并执行,但是eval不支持逻辑性代码
二、不依赖class关键字创建类
如何产生一个类:
# 上面说类由:类名、父类、类的名称空间组成 class_name = 'User' # 类名 class_base = (object,) # 父类,注意必须是元组,逗号不能忘 #类的名称空间:类体代码 res = """ school = "oldboy" def __init__(self): self.name = name def func(): pass """ class_attrs = {} exec(res,{},class_attrs) # 将res执行产生的名称空间放到class_attrs中
# class_global(中间)一般情况下都为空,除非在字符串代码内部用global关键字声明,才会将产生的名字丢到class_global全局名称空间中
print(class_attrs)
# {'school': 'oldboy', '__init__': <function __init__ at 0x0000000001D02EA0>, 'func': <function func at 0x00000000027DDE18>}
# 调用元类创建自定义类
User = type(class_name,class_bases,class_attrs) #传参:将类名、父类、类的名称空间丢给type产生 print(User) #<class '__main__.User'>
# 它可以访问自身的属性和方法,并实例化产生对象 print(User.school) #oldboy obj = User('Simon') print(obj.name) # Simon print(obj) # <__main__.User object at 0x0000000001E7CF98>
三、自定义元类控制类的创建过程
class MymetaClass(type): # 必须是继承了type的类才是自定义元类 def __call__(self, *args, **kwargs): # 1.先创建一个对象的名称空间 __new__ # 2.往改名称空间中丢一堆名字 __init__ # 3.产生好的对象返回出去 # 1.产生一个空对象 obj = self.__new__(self) # 2.实例化该对象 self.__init__(obj, *args, **kwargs) # 3.返回该对象 return obj # return super().__call__(*args,**kwargs) class Demo(metaclass=MymetaClass): # 指定Demo的元类是MymetaClass pass obj = Demo() print(obj) # <__main__.Demo object at 0x00000000027EC898> print(type(obj)) # <class '__main__.Demo'>
# 标准可以直接参照这个使用
# 表名 主键 一对字段 class MemetaClass(type): # def __new__(cls, class_name,class_bases,class_attrs): if class_name == 'Userinfo': raise TypeError('我不想鸟你') if 'school' in class_attrs: class_attrs['school'] = 'xx最大线上xx开业啦' class_attrs['table_name'] = 'userinfo' class_attrs['primary_key'] = 'id' return type.__new__(cls,class_name,class_bases,class_attrs) class User(object,metaclass=MemetaClass): # 通过metaclass可以指定类的元类 school = 'oldboy' print(User.__dict__) """ {'__module__': '__main__', 'school': 'xx最大线上xx开业啦', 'table_name': 'userinfo', 'primary_key': 'id', '__dict__': <attribute '__dict__' of 'User' objects>, '__weakref__': <attribute '__weakref__' of 'User' objects>, '__doc__': None} """
最详细的方法:https://www.cnblogs.com/Dominic-Ji/p/10520256.html