1.元类:类实例化得到对象,元类实例化得到类,类也可以看作对象,默认使用关键字class定义的类的元类为type
推论:可见class关键字在创建类时底层代码逻辑调用了type元类
2.模拟class关键字底层代码逻辑实现非class关键字定义类
# 1.定义类名
class_name = 'MyClass'
# 2.定义继承的父类
class_bases = (object, )
# 3.类的成员属性和方法
class_dic = {}
class_body = '''
"""
这是我定义的元类
"""
property = '非class关键字创建类'
def __init__(self, name, age):
self.name = name
self.age = age
def func(self):
print('232132%s' % self.name)
'''
exec(class_body, {}, class_dic)
# 使用非class关键字定义一个类
MyClass = type(class_name, class_bases, class_dic)
3.自定义元类
import re
class Mymeta(type):
# 自动传入继承元类所要创建类的类名,继承的父类,以及成员属性和方法的名称字典进行逻辑判定
def __init__(self, class_name, class_bases, class_dic):
if not re.search('[A-Z]', class_name):
raise BaseException('必须使用驼峰体命名类名!')
if len(class_bases) == 0:
raise BaseException('至少需要继承一个类')
if not (class_dic.get('__doc__') and len(class_dic.get('__doc__').strip()) > 0):
raise BaseException('必须标注说明文档,且内容不能为空!')
# 定义继承我的元类Mymeta的类创建对象时触发魔术方法call时代码逻辑,实际继承的type的call魔术方法也是这一套代码实现
def __call__(self, *args, **kwargs):
# 创建一个传入的类的空对象
obj = object.__new__(self)
# 调用传入类的init函数对空对象obj进行初始化属性
self.__init__(obj, *args, **kwargs)
# 返回完成初始化的对象
return obj
# 定义一个类,使用metaclass接收自定义的元类进行继承
class MyClass(object, metaclass=Mymeta):
'''
婚纱打开手机
'''
def __init__(self, name, age, salary):
self.info = (name, age, salary)
def fun(self):
print(self.info)