(1)第一种:直接创建
1 class Foo(object,metaclass=type): 2 def __init__(self): 3 print("我执行了") 4 super().__init__() 5 6 def test(self,x): 7 return x+1
(2)第二种:通过type创建(这种方式不常用,可读性差,我们只需要知道底层是经过type创建的类)
1 Foo_1 = type('Foo',(object,),{'city':'Chengdu', 'func':lambda self,x:x+1}) # 函数名func,参数self,x,返回x+1,这里的lambda匿名函数可由外层定义的函数替换,写入函数名称即可
2 print(Foo_1())
(3)类由自定义的type创建,指定metaclass(当前类由哪个类创建),默认metaclass=type
由于我们不知道type内部怎样实现创建类的,那么我们就继承,保留其功能,再开发新的东西
1 class Mytype(type): # 继承type,保留其功能,再开发一些新的功能 2 3 def __init__(self, *args, **kwargs): 4 print("我被执行了,在创建类之前") # 运行程序后会被打印是因为创建类的时候,需要执行__init__ 5 super().__init__(self) 6 print("我被执行了,在创建类之后") 7 8 9 class Foo1(object,metaclass=Mytype): # 当前类由Mytype创建 10 def __init__(self): 11 print("我执行了") #没有打印,需要加括号调用才执行__init__ 12 super().__init__() 13 14 def test(self,x): 15 return x+1
运行程序底层执行顺序:
① Mytype的__init__ # 创建Foo1
② Mytype的__call__ # 类是由Mytype创建的,执行__call__方法,调用去创建Foo1,要实例化
③ Foo1的__new__
④ Foo1的__init__
程序运行后虽然没有实例化,但是Foo1类确实创建了,通过metaclass=Mytype创建的,所以执行了Mytype里的__init__方法,打印了"之前""之后"
Foo1的所有派生类都由Mytype创建
以上,虽然开发中不常用,但是源码会见到,所以我们知道就行