__metaclass__方法

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)
  
= 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

创建过程如下:

 

更多__metaclass__知识:点击

总结:

  类的生成 调用 顺序依次是 __new__ --> __init__ --> __call__

原文地址:https://www.cnblogs.com/chengege/p/11102802.html