hechengQAQ

导航

 

(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创建

以上,虽然开发中不常用,但是源码会见到,所以我们知道就行













 

posted on 2023-03-01 22:01  hechengQAQ  阅读(50)  评论(0编辑  收藏  举报