Created
November 3, 2015 16:35
Revisions
-
kaka19ace created this gist
Nov 3, 2015 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,103 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- # # @file test_metaclass.py # @author kaka_ace <[email protected]> # @date Nov 03 2015 # @brief # class MyMeta(type): def __new__(cls, name, bases, d): print("-------------- meta new --------------") print(cls) print(name) print(bases) print(d) cls = type.__new__(cls, name, bases, d) return cls def __init__(cls, name, bases, d): print("-------------- meta init --------------") print(cls) print(name) print(bases) print(d) super(MyMeta, cls).__init__(name, bases, d) def __call__(cls, *args, **kwargs): print("-------------- meta call --------------") print(cls) print(args) print(kwargs) return type.__call__(cls, *args, **kwargs) class Base(metaclass=MyMeta): STATUS = 1 def __new__(cls, *args, **kwargs): print("-------------- Base new --------------") print(cls) print(args) print(kwargs) return super(Base, cls).__new__(cls) # object 不需要加参数啦 def __init__(self, *args, **kwargs): print("-------------- Base init --------------") print(self) print(args) print(kwargs) super(Base, self).__init__() # 此时输出: # meta new Base # meta init Base class Derive(Base): D_STATUS = 1 def __new__(cls, *args, **kwargs): print("-------------- Derive new --------------") print(cls) print(args) print(kwargs) return super(Derive, cls).__new__(cls, *args, **kwargs) def __init__(self, *args, **kwargs): print("-------------- Derive init --------------") print(self) print(args) print(kwargs) super(Derive, self).__init__(*args, **kwargs) # 此时输出: # meta new Derive # meta init Derive """ b 实例生成过程: meta call Base new b 实例生成 b init -> Base init """ b1 = Base(1) """ d 实例生成过程: meta call Derive new Base new b 实例生成 b init -> Derive init -> Base init """ d1 = Derive('a') print("-----------------------------") # 同 b1, d1 b2 = Base() d2 = Derive()