• __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__

  • 相关阅读:
    浅谈Javascript数据属性与访问器属性
    深入浅析JavaScript中的constructor
    javascript 继承
    很认真的聊一聊程序员的自我修养
    JavaScript数据属性与访问器属性
    Js中的数据属性和访问器属性
    [javascript基础]constructor与prototype
    C# System.Net.Mail
    Execl (转)导入导出execl 全
    delegate 委托方法
  • 原文地址:https://www.cnblogs.com/chengege/p/11102802.html
Copyright © 2020-2023  润新知