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()

  • 相关阅读:
    junit单元测试
    方法引用
    方法引用表达式(1)
    Stream流的常用方法
    Stream流
    综合案例:文件上传
    tcp通信协议
    python 生成器与迭代器
    Python 序列化与反序列化
    python 文件操作
  • 原文地址:https://www.cnblogs.com/mingaixin/p/2880273.html
Copyright © 2011-2022 走看看