GVKun编程网logo

Python(和Python C API):__new__与__init__(python跟c)

18

本文将为您提供关于Python的详细介绍,我们还将为您解释和PythonCAPI:__new__与__init__的相关知识,同时,我们还将为您提供关于new__与__init__的区别、python

本文将为您提供关于Python的详细介绍,我们还将为您解释和Python C API:__new__与__init__的相关知识,同时,我们还将为您提供关于new__与__init__的区别、python __new__ 和 __init__、python __new__和__init__的区别、python 中 __init__和__new__的区别的实用信息。

本文目录一览:

Python(和Python C API):__new__与__init__(python跟c)

Python(和Python C API):__new__与__init__(python跟c)

我要问的问题似乎是Python对__new__和__init__的重复使用?,但无论如何,我仍然不清楚__new__和之间的实际区别是什么__init__

在您急于告诉我__new__创建对象和__init__初始化对象之前,请让我明确: 我明白了。
实际上,这种区分对我来说是很自然的,因为我在C
++中有经验,在那里我们放置了new,它类似地将对象分配与初始化分开。

在Python的C
API教程解释它是这样的:

新成员负责创建(而不是初始化)该类型的对象。它在Python中作为__new__()方法公开。…
实施新方法的原因之一是要确保实例变量的初始值

所以,是的-我 知道__new__,但是尽管如此,我 仍然
不明白为什么它在Python中很有用。给出的示例说,__new__如果要“确保实例变量的初始值”
,这可能会很有用。好吧,那不就是__init__要做什么吗?

在C API教程中,显示​​了一个示例,其中创建了新的Type(称为“
Noddy”),并__new__定义了Type的功能。Noddy类型包含一个名为的字符串成员first,并且该字符串成员被初始化为一个空字符串,如下所示:

static PyObject * Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds){    .....    self->first = PyString_FromString("");    if (self->first == NULL)    {       Py_DECREF(self);       return NULL;    }    .....}

请注意,如果没有在此__new__定义的方法,我们将不得不使用PyType_GenericNew,它只会将所有实例变量成员初始化为NULL。因此,该__new__方法的唯一好处是实例变量将从一个空字符串开始,而不是NULL。
但是为什么这会有用呢,因为如果我们要确保实例变量被初始化为某个默认值,那么我们可以在__init__方法中做到这一点?

答案1

小编典典

差异主要发生在可变与不可变类型之间。

__new__接受一个 类型 作为第一个参数,并且(通常)返回该类型的新实例。因此,它适用于可变类型和不可变类型。

__init__接受一个 实例
作为第一个参数,并修改该实例的属性。这不适用于不可变类型,因为它允许在创建后通过调用修改它们obj.__init__(*args)

比较的行为tuplelist

>>> x = (1, 2)>>> x(1, 2)>>> x.__init__([3, 4])>>> x # tuple.__init__ does nothing(1, 2)>>> y = [1, 2]>>> y[1, 2]>>> y.__init__([3, 4])>>> y # list.__init__ reinitialises the object[3, 4]

关于它们为何分开的原因(除了简单的历史原因):__new__方法需要一堆样板才能正确(最初的对象创建,然后记得最后返回对象)。__init__相比之下,方法非常简单,因为您只需设置需要设置的任何属性即可。

除了__init__更易于编写的方法以及上面提到的可变与不可变的区别外,还可以利用这种分隔,__init__通过在中设置任何绝对必要的实例不变式,使在子类中调用父类成为可选的__new__。不过,这通常是一种可疑的做法-
通常__init__在需要时调用父类方法会更清晰。

new__与__init__的区别

new__与__init__的区别

__new__是Python面向对象语言中一个很少用的函数,更多使用的是__init__这个函数
class Book(object):
    def __new__(cls, title):
        print(''__new__'')
        cls.m = 2
        print(super().__new__(cls))
        return super().__new__(cls)

    def __init__(self, title):
        print(self)
        print(''__init__'')
        self.title = title


b = Book(''The Django Book'')
print(b.title,b.m)


结果如下:

__new__
<__main__.Book object at 0x00000000025BB4A8>
<__main__.Book object at 0x00000000025BB4A8>
__init__
The Django Book 2

可以看到, 其实创建实例的时候, 先运行的_new_方法, _new_创建对象Book object(实例)返回给你_init_里面的第一个参数self

根据官方文档也可以得到证明 :

init是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值。

new是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法。

new的应用场景
官方文档指出new方法的两种用法。

允许继承不可变类型(str,int, tuple)
关于这种也有比较多的例子,网上搜到的例子基本上都属于理论性,实际中用法不太常见。
Python基础,python运维、自动化运维、运维开发、web、web开发、python爬虫、数据析、数据挖掘、Django、flask、python自动化测试等技术交流资料分享欢迎大家一起来加群:418775537

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和Python C API:__new__与__init__的分享已经结束,谢谢您的关注,如果想了解更多关于new__与__init__的区别、python __new__ 和 __init__、python __new__和__init__的区别、python 中 __init__和__new__的区别的相关知识,请在本站进行查询。

本文标签: