2 Star 6 Fork 5

AmCoder / AmCoder

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
面向对象之metaclass.md 1.21 KB
一键复制 编辑 原始数据 按行查看 历史
AmCoder 提交于 2020-05-30 10:25 . 第一次提交
  1. 创建类时先执行type的__init__()方法 ,通过指定metaclass可以指定由哪个类创建
class MyType(type):
    def __init__(self,*args,**kwargs): #2.先执行
        super(MyType,self).__init__(*args,**kwargs)
    def __call__(cls,*args,**kwargs):
        obj = Foo.__new__(cls)
        cls.__init__(obj)
        return obj

class Foo(object,metalass=MyType): #1.创建类时
    def __init__(self):
        pass
    def __new__(cls,*args,**kwargs):
        return object.__new__(cls)
    def __func_(self):
        pass
  1. 当一个类实例化时执行type的__call__()方法,call()方法的返回值就是实例化的对象
class MyType(type):
    def __init__(self,*args,**kwargs):
        super(MyType,self).__init__(*args,**kwargs)
    def __call__(cls,*args,**kwargs): #2.先执行
        obj = Foo.__new__(cls) #3.调用Foo的new方法 obj等于new的返回结果
        cls.__init__(obj) #4.调用Foo的构造方法
        return obj

class Foo(object,metalass=MyType):
    def __init__(self): #4.执行Foo的构造方法
        pass
    def __new__(cls,*args,**kwargs):#3.执行new方法
        return object.__new__(cls)
    def __func_(self):
        pass

obj = Foo() #1.实例化时
其他
1
https://gitee.com/AmCoder/AmCoder.git
git@gitee.com:AmCoder/AmCoder.git
AmCoder
AmCoder
AmCoder
master

搜索帮助