元类:

  • 用来创建类的类,叫做元类
  • Python中的任何新式类以及Python 3中的任何类都是type元类的一个实例。函数type实际上是一个元类。type就是Python在背后用来创建所有类的元类
type: 是元类,所有的类都是通过type所创建出来的
object:顶层的基类,所有类的继承顶层父类都是object
# 元类type创建类需要三个参数, 
# 第一个为类名(str类型),即类的__name__属性
# 第二个为继承的父类(tuple类型),
# 第三个是属性和方法{dict类型}
def work2(self):
print("----work2---方法")


# 通过元类动态生产类
Demo2 = type('Demo2', (object,), {'name': 999, 'work2': work2})
自定义元类:
import unittest


class MyMateClass(type):
"""自定义元类"""

def __new__(cls, name, bases, attrs, *args, **kwargs):
# 调用父类的new方法去创建类
bases = (unittest.TestCase,)
new_cls = super().__new__(cls, name, bases, attrs)
# 在此处可以对创建出来的类进行相关的操作
for item in new_cls.caseData:
setattr(new_cls, 'test_work_{}'.format(item), lambda x: x * 2)

return new_cls


# 使用自定义的元类去创建类
res = MyMateClass('Demo', (object,), {'name': 'demo类', 'caseData': [11, 22, 33, 44]})

print(res)
print(res.__dict__)
使用class定义类时指定元类去创建类:
class MyMateClass(type):
"""自定义元类"""

def __new__(cls, name, bases, attrs, *args, **kwargs):
new_cls = super().__new__(cls, name, bases, attrs)
new_cls.name = 'zyj'
new_cls.age = 18
return new_cls


# 定义类时,可以使用metaclass去指定元类来创建类
class Demo(object, metaclass=MyMateClass):
pass


print(Demo.__dict__)