zoukankan      html  css  js  c++  java
  • python __init__和__new__之间的区别

    转载自 http://blog.csdn.net/carolzhang8406/article/details/6856056

    1 如果在类中同时定义了__init__和__new__,在创建对象的时候会有优先使用__new__


    class A(object):
        def __init__(self):
            print("in init")
        def __new__(self):
            print("in new")
           
    A()

    2new方法会返回所构造的对象,init则不会,在使用new返回对象的时候会隐式调用init函数。new函数必须以cls作为第一个参数,而init则以self作为其第一个参数

    实例:

    class A(object):
      def __new__(cls, *args, **kwds):
        print "one"
        print "A.__new__", args, kwds
        return object.__new__(B, *args, **kwds)
      def __init__(cls, *args, **kwds):
        print "two"
        print "A.__init__", args, kwds
    class B(object):
      def __new__(cls, *args, **kwds):
        print "three"
        print cls
        print B
        print "B.__new__", args, kwds
        return object.__new__(cls, *args, **kwds)
      def __init__(cls, *args, **kwds):
        print "four"
        print "B.__init__", args, kwds
    class C(object):
      def __init__(cls, *args, **kwds):
        print "five"
        print "C.__init__", args, kwds
    print C()
    print "====================="
    print A()
    print "====================="
    print B()


    利用new创建一个类的对象的最常用的方法为:super(currentclass, cls).__new__(cls[, ...]) 
    如下列

    class A(object):
        def __new__(cls):
            Object = super(A, cls).__new__(cls)
            print "in New"
            return Object
        def __init__(self):
            print "in init"


    class B(A):
        def __init__(self):
            print "in B's init"
            
    B()

  • 相关阅读:
    C++ SDL2事件处理
    C++ SDL_Image配置
    C++ TinyXML库读写XML
    C++ libcurl库使用
    C++ 配置使用libcurl
    C++ 正则使用
    C++使用cJSON
    Vue通过状态为页面切换添加loading、为ajax加载添加loading
    移动端真机调试工具--DebugGap (VIDE)
    new Date(str)返回的时间结果在移动端比PC端快了8小时
  • 原文地址:https://www.cnblogs.com/mingaixin/p/2880273.html
Copyright © 2011-2022 走看看