metaclass这个属性叫做元类,它是用来表示这个类是由谁来帮他实例化创建的,说白了,就是相当于自己定制一个类。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
class MyType( type ): def __init__( self , * args, * * kwargs): print ( "Mytype __init__" , * args, * * kwargs) def __call__( self , * args, * * kwargs): print ( "Mytype __call__" , * args, * * kwargs) obj = self .__new__( self ) print ( "obj " ,obj, * args, * * kwargs) print ( self ) self .__init__(obj, * args, * * kwargs) return obj def __new__( cls , * args, * * kwargs): print ( "Mytype __new__" , * args, * * kwargs) return type .__new__( cls , * args, * * kwargs) class Foo( object ,metaclass = MyType): #python3统一用这种 #__metaclass__ = MyType #python2.7中的写法 def __init__( self ,name): self .name = name print ( "Foo __init__" ) def __new__( cls , * args, * * kwargs): print ( "Foo __new__" , cls , * args, * * kwargs) return object .__new__( cls ) f = Foo( "shuaigaogao" ) print ( "f" ,f) print ( "fname" ,f.name) #输出 Mytype __new__ Foo (< class 'object' >,) { '__new__' : <function Foo.__new__ at 0x0000025EF0EFD6A8 >, '__init__' : <function Foo.__init__ at 0x0000025EF0EFD620 >, '__qualname__' : 'Foo' , '__module__' : '__main__' } Mytype __init__ Foo (< class 'object' >,) { '__new__' : <function Foo.__new__ at 0x0000025EF0EFD6A8 >, '__init__' : <function Foo.__init__ at 0x0000025EF0EFD620 >, '__qualname__' : 'Foo' , '__module__' : '__main__' } Mytype __call__ shuaigaogao Foo __new__ < class '__main__.Foo' > obj <__main__.Foo object at 0x0000025EF0F05048 > shuaigaogao < class '__main__.Foo' > Foo __init__ f <__main__.Foo object at 0x0000025EF0F05048 > fname shuaigaogao |
创建过程如下:
总结:
类的生成 调用 顺序依次是 __new__ --> __init__ --> __call__