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

  • 相关阅读:
    ApacheServer-----关于443端口被占用的解决方法
    《小强与小明》——正在疯传的伟大的故事
    不争万年,只珍朝夕------我的态度
    dubbo搭建
    使用netty的第一个Hello World
    myBatis数据库常用标签
    mysql 索引
    tomcat部署项目的一点心得
    【康托展开】
    初探计算机硬盘
  • 原文地址:https://www.cnblogs.com/mingaixin/p/2880273.html
Copyright © 2011-2022 走看看