GVKun编程网logo

Python-为什么总是在__new __()之后调用__init __()?(为什么python运行后不出结果)

21

如果您想了解Python-为什么总是在__new__的相关知识,那么本文是一篇不可错过的文章,我们将对之后调用__init__进行全面详尽的解释,并且为您提供关于python__new__和__ini

如果您想了解Python-为什么总是在__new __的相关知识,那么本文是一篇不可错过的文章,我们将对之后调用__init __进行全面详尽的解释,并且为您提供关于python __new__ 和 __init__、python __new__和__init__的区别、python 中 __init__和__new__的区别、Python 中__init__和__new__的区别是什么?的有价值的信息。

本文目录一览:

Python-为什么总是在__new __()之后调用__init __()?(为什么python运行后不出结果)

Python-为什么总是在__new __()之后调用__init __()?(为什么python运行后不出结果)

我只是想简化我的一个类,并以与flyweight设计模式相同的样式介绍了一些功能。

但是,对于为什么__init__总是被称为after ,我有点困惑__new__。我没想到这一点。谁能告诉我为什么会这样,否则我如何实现此功能?(除了将实现放到__new__hacky中之外)。

这是一个例子:

class A(object):    _dict = dict()    def __new__(cls):        if ''key'' in A._dict:            print "EXISTS"            return A._dict[''key'']        else:            print "NEW"            return super(A, cls).__new__(cls)    def __init__(self):        print "INIT"        A._dict[''key''] = self        print ""a1 = A()a2 = A()a3 = A()

输出:

NEWINITEXISTSINITEXISTSINIT

为什么?

答案1

小编典典

使用__new__时,你需要控制一个新实例的创建。

使用 __init__时,你需要一个新的实例的控件初始化。

__new__是实例创建的第一步。首先调用它,它负责返回类的新实例。

相反, __init__不返回任何东西。创建实例后,它仅负责初始化实例。

通常,除非你要__new继承不可变类型(如str,int,unicode或tuple),否则无需覆盖__`。

从2008年4月发布:何时使用__new__vs __init__?在mail.python.org上。

你应该考虑到你通常想通过工厂来完成的工作,这是最好的方法。使用__new__不是一个好的清洁解决方案,因此请考虑使用工厂。在这里,你有一个很好的工厂示例。

python __new__ 和 __init__

python __new__ 和 __init__

概述

newinit 是类实例化的过程中被调用的方法, new 负责对象的创建,相当于构造器或者构造函数; init 负责对象初始化。 使用频率上, init 较多会被使用。

class A(object):

    def __new__(cls):
        return object.__new__(cls)

    def __init__(self):
        self.instance_method()

    def instance_method(self):
        print ''success!''

newA = A()

区别

参数

new 的第一个参数是 cls,表示类本身。

init 类似一般的实例方法, 第一个参数是 self,表示实例。我们可以看到 init 方法运行之前, 实例已经可以被使用了(self参数)。实例上的其他的方法也是可以使用的了。

调用时机

当我们创建类的对象时, new 先被调用,返回一个对象,对象引用作为参数传递给 init__, 然后对象属性被初始化。__init 方法不能返回任何数据。

__new__ --->(创建对象) --> __init__(self)

使用

只有很少的时候需要自己编写 new 方法,比如单例模式。大多数情况下,只需要关心实例的初始化,初始化过程中属性的分配,以及是否调用其他的实例方法。

以上代码和经验仅在 Python(2.7) 得到验证。

python __new__和__init__的区别

python __new__和__init__的区别

__new__和__init__的区别

# new 是用来控制对象的生成过程,在对象生成之前
# init 是用来完善对象的
# 如果new方法不返回对象,则不会调用init方法

class User:
    def __new__(cls, *args, **kwargs):
        print("in new")
        return super().__new__(cls)

    def __init__(self, name):
        print("in init")
        self.name = name


if __name__ == ''__main__'':
    user = User(name="abc")

python 中 __init__和__new__的区别

python 中 __init__和__new__的区别

用过 python 写过面向对象的代码的人对__init__方法应该很熟悉了,__init__ 方法通常用在初始化一个类实例的时候.

例如:

# -*- coding: utf-8 -*-
''''''
Created on Mar 31, 2016

@author: fky
''''''
class Test(object):
    def __init__(self,name):
        self.name = name
        
    def __str__(self,):
        return ''<Test: %s>'' % self.name
    

if __name__ == ''__main__'':

    test = Test(''test1'')
    print(test)

  结果:

<Test: test1>

这就是__init__普通用法,其实当实例化一个类最先被调用的方法 __new__ 方法。

class Test(object):
    
    def __new__(self,name):
        print(''__new__'')
        return super().__new__(self)
    
    def __init__(self,name):
        print(''__init__'')
        self.name = name
        
    def __str__(self,):
        return ''<Test: %s>'' % self.name
    

if __name__ == ''__main__'':

    test = Test(''test1'')
    print(test)

结果:

__new__
__init__
<Test: test1>

从这个运行结果可以看到__new__方法的调用是发生在__init__之前的。


__new__ 的作用

依照 Python 官方文档的说法,__new__方法主要是当你继承一些不可变的 class 时 (比如 int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径。还有就是实现自定义的 metaclass。





Python 中__init__和__new__的区别是什么?

Python 中__init__和__new__的区别是什么?

  __init__和__new__二者均是 Python 面向对象语言中的函数,其中__new__使用频率较少,__init__则使用的频率较多,那么 Python 中__init__和__new__的区别是什么?具体请看以下内容介绍。

  在 Python 中,__init__和__new__是两个特殊的方法,用于对象的创建和初始化过程。它们的作用和执行时有所不同:

  1、__new__

  __new__是一个用于创建对象的特殊方法,是在对象实例化之前调用的。

  __new__方法负责创建对象,并返回一个新的对象实例。

  __new__方法是一个类方法,必须返回一个新的对象实例。

  可以通过重写__new__方法来控制对象的创建过程,例如自定义对象的创建逻辑、返回其他类型的实例等。

  2、__init__

  __init__是一个用于对象初始化的特殊方法,是在对象实例化之后调用的。

  __init__方法接收新创建的对象实例作为其第一个参数,并在该方法内部对对象的属性进行初始化。

  __init__方法通常用于设置对象的初始状态,对属性进行赋值等操作。

  __init__方法不需要返回任何内容,它的主要目的是对对象进行初始化。

  总结:

  __new__是在对象实例化之前调用,用于创建对象实例;

  __init__是在对象实例化之后调用,用于初始化对象的属性。

  在实际使用中,通常情况下我们只需要重写__init__方法来实现对象的初始化,而对__new__方法进行修改的需求相对较少。

我们今天的关于Python-为什么总是在__new __之后调用__init __的分享就到这里,谢谢您的阅读,如果想了解更多关于python __new__ 和 __init__、python __new__和__init__的区别、python 中 __init__和__new__的区别、Python 中__init__和__new__的区别是什么?的相关信息,可以在本站进行搜索。

本文标签: