zoukankan      html  css  js  c++  java
  • 进一步认识__new__和__call__

    1.关于__init__

    class F00(object):
    def __init__(self,name):
    self.name = name
    print("Foo--init--")
    def __new__(cls, *args, **kwargs):
    print("Foo--new--")
    return object.__new__(cls)#cls表示将Foo类传进__new__方法中,表示继父类的__new__方法



    f= F00("name")
    #当存在return object.__new__(cls)时,先后输出Foo--new--和Foo--init--,说明__new__执行在__init__之前
    #当去掉return object.__new__(cls)时,只输出Foo--new--,说明__init__实例时没有被实例
    #总结:__new__方法是类里面自带的,new是用户来创建实例的,默认不写,可以重写
    #作用:在实例化时会先于__init__执行,我们想在实例化之前




    2.关于__call__

    class MyType(type):
    def __init__(self,what,bases=None,dict=None):
    super(MyType, self).__init__(what,bases,dict)
    def __call__(self, *args, **kwargs):
    obj=self.__new__(self,*args, **kwargs)
    self.__init__(obj)

    class Foo(object):#底层是通过MyType类的 __init__方法实现的
    __metaclass__ =MyType
    def __init__(self,name):#底层是通过MyType类的__call__方法的self.__init__(obj)实现的
    self.name = name
    def __new__(cls, *args, **kwargs):
    return object.__new__(cls)#底层是通过MyType类的__call__方法的obj=self.__new__(self,*args, **kwargs)实现的



    obj=Foo("name")#执行创建Foo的实例其实是执行MyType类的__call__方法
    #__call__作用时用于创建__new__的

  • 相关阅读:
    python 访问对象的属性与方法
    python 使用类实列化对象
    python 第一个Python类(创建类)
    python 安装第三方模块
    Redux其实很简单(原理篇)
    JavaScript、ES5和ES6的介绍和区别
    Yes,I know the way to learn Ens !
    移动游戏加载性能和内存管理全解析 学习
    内存耗用:VSS/RSS/PSS/USS
    Android性能测试-内存
  • 原文地址:https://www.cnblogs.com/zfquan/p/7568105.html
Copyright © 2011-2022 走看看