首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

“我们是不可变的,所以使用__new__而不是__init__”

在Python中,newinit都是用于创建对象的特殊方法。new方法在对象创建之前被调用,用于创建并返回一个实例对象。而init方法在对象创建之后被调用,用于初始化对象的属性。

当我们希望创建一个不可变的对象时,可以使用new方法而不是init方法。因为new方法返回的是一个新的实例对象,而init方法只是对已存在的对象进行初始化操作。

不可变对象是指其状态(即值)在创建后不能被修改的对象。在Python中,不可变对象包括数字、字符串、元组等。由于不可变对象的值不能被修改,因此每次对不可变对象进行修改操作时,实际上是创建了一个新的对象。

使用new方法创建不可变对象的优势在于可以确保对象的不可变性。由于new方法在对象创建之前被调用,因此可以在创建对象时对其进行限制,确保对象的值在创建后不能被修改。

应用场景:

  1. 缓存:由于不可变对象的值不会发生变化,可以将其作为缓存的键值,提高缓存的效率。
  2. 多线程环境:不可变对象在多线程环境下是线程安全的,不需要额外的同步机制。

推荐的腾讯云相关产品和产品介绍链接地址: 腾讯云提供了多种云计算相关产品,以下是其中几个与不可变对象相关的产品:

  1. 云服务器(CVM):腾讯云的云服务器产品,提供了可靠的计算能力,适用于各种应用场景。链接:https://cloud.tencent.com/product/cvm
  2. 云数据库 MySQL 版(CDB):腾讯云的云数据库产品,支持高可用、可扩展的 MySQL 数据库服务。链接:https://cloud.tencent.com/product/cdb_mysql
  3. 云缓存 Redis 版(TencentDB for Redis):腾讯云的云缓存产品,提供了高性能、可扩展的 Redis 服务。链接:https://cloud.tencent.com/product/redis

请注意,以上仅为示例产品,腾讯云还提供了更多与云计算相关的产品,您可以根据具体需求选择适合的产品。

相关搜索:我们可以将Keras输入形状中的特征设置为可变而不固定吗?我们可以编写自己的GUI而不是使用kibana吗虚拟目录的根目录是localhost,而不是localhost/myapp。所以我所有的链接都坏了Laravel (cli)使用的是php 5.4而不是7我们可以在Scrapy中使用锁吗?因为Scrapy是单线程的,所以需要它们吗?gatsby链接使用的是当前地址,而不是根地址为什么我不应该使用不可变的POJO而不是JavaBeans?我的POST请求使用的是Node.js,而不是APIMonkeyrunner使用的是python 2.x而不是3.x使用ARSCNPlaneGeometry获取SCNPhysicsShape生成的是球体形状,而不是平面为什么我们使用序列化器而不是完整的clean来验证模型,或者我们应该互换使用它们?如果我们只有一个有状态pod的副本,我们可以使用部署资源而不是StatefulSet吗?我们可以使用像素而不是像word2vec这样的技术吗?为什么我们在计算校验和时使用1的补码而不是2的补码异常不抛出我的字符串--它抛出的是文字异常,而不是我抛出的我们如何根据标题进行分组和求和?因此是水平的,而不是垂直的,分组依据和总和如何确定weblogic使用的是标准版而不是企业版?Jenkins Windows Slave未编译,因为它使用的是JRE而不是JDK使用SharePoint Online,我如何删除是“链接”而不是“帖子”的新闻项目?我如何确定使用的是亚马逊ElasticSearch服务,而不是随意的ES?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

详解Python中__init__和__new__区别

但__init__其实不是实例化一个类时候第一个被调用 方法。当使用 Persion(name, age) 这样表达式来实例化一个类时,最先被调用方法 其实是 __new__ 方法。...二、__new__ 方法是什么? __new__方法接受参数虽然也是和__init__一样,但__init__在类实例创建之后调用, __new__方法正是创建这个类实例方法。 ?...首先执行使用name和age参数来执行Person类__new__方法,这个__new__方法会 返回Person类一个实例(通常情况下使用 super(Persion, cls)....但运行后会发现,结果根本不是我们那样,我们任然得到了-3。这是因为对于int这种 不可变对象,我们只有重载它__new__方法才能起到自定义作用。 这是修改后代码: ?...因为类每一次实例化后产生过程都是通过__new__来控制所以通过重载__new__方法,我们 可以很简单实现单例模式。 ? 输出结果: ? 可以看到obj1和obj2同一个实例。

1.7K10

Python类中__new__和__init__区别

在写Python类时,或者看某些项目源码时,总是见到__init__和__new__方法,一直没有深入研究两者区别,今天聊聊这个。 __new__ __new__类(class)方法。...但运行后会发现,结果根本不是我们那样,我们任然得到了-3。这是因为对于int这种 不可变对象,我们只有重载它__new__方法才能起到自定义作用。这是修改后代码: ?...通过重载__new__方法,我们实现了需要功能。 __init__ __init__实例方法。...class调用__init__时,对这个class生成新实例初始化,初始化内容,就是__init__内定义内容。...每新创建一个实例,实例都会初始化这些内容,这些内容都是初始化给新创建实例,跟class无关。 __init__返回任何东西。

70650
  • Python 中类构造方法 __new__ 妙用

    __del__,今天来聊一聊__new__妙用,主要分享以下几点: __new__ 和 __init__ 区别 应用1:改变内置可变类型 应用2:实现一个单例 应用3:客户端缓存 应用4:不同文件不同解密方法...应用5:Metaclasses __new__ 和 __init__ 区别 1、调用时机不同:new 真正创建实例方法,init 用于实例初始化,new 先于 init 运行。...2、返回值不同,new 返回一个类实例, init 返回任何信息。 3、new class 方法, init 对象方法。...,以下其主要应用场景: 应用1:改变内置可变类型 我们知道,元组可变类型,但是我们继承 tuple ,然后可以在 new 中,对其元组元素进行修改,因为 new 返回之前,元组还不是元组,这在...__new__(cls, upper_iterable) # 以下代码会报错,初始化时无法修改 # def __init__(self, iterable): #

    57810

    Python new 类方法和 ini

    所以,__new__ 方法一个类方法,用于创建一个实例, __init__ 方法一个实例方法,用于初始化一个实例。...__new__(cls, *args, **kwargs) 如果 __new__ 方法返回 cls 一个实例,那么新实例 __init__ 方法不会被调用。...new 方法作用 __new__ 方法比较常用作用大概: 1、 继承内建不可变类型时(比如int, str, tuple),提供自定义实例化过程。...__(self): pass 需要注意使用装饰器实现单例时,类已经变成了一个函数,不再类。...然后,我想着用 is 来判断下他们是否真的同一个实例: >>> A() is A() False 我没有对 CPython 源码进行过全面的阅读,所以对其很多内部实现机制不是太了解。

    1.5K30

    Python面试必备,看完轻轻松松拿到10k

    __new__和__init__区别 前面有一篇文章(这8道Python面试题,你答出来),__init__方法其实是初始化方法,真正构造方法__new__。__new__类方法....当时没有举例子,不太好理解,这里我们看一个小例子,比如我们都知道tuple元组可变对象,如果我们想自己构造一个新元组返回都是int,我们自定义一个IntTuple来继承tuple,来深入理解一下_..._new__和__init__秘密。...也就是说我们我们传进去seq[1,-1,'-a'],在__init__里面没有地方可以更改,那如何更改呢,这是时候__new__要上场了....我们对seq进行过滤处理,只留一下int类型,然后__new__里面return返回处了类实例给__init__(),其实__init__里面的self就是__new__返回! 3.

    77280

    Python 经典面试题 二

    3、__init__有一个参数 self,就是这个__new__返回实例,__init__在__new__基础上可以完成一些其它初始化动作,__init__不需要返回值。...4、如果__new__创建当前类实例,会自动调用__init__函数,通过 return 语句里面调用__new__函数第一个参数 cls 来保证当前类实例,如果其他类类名,;那么实际创建返回就是其他类实例...') del dic['age'] print(dic) 7.列出几种魔法方法并简要介绍用途 __init__:对象初始化方法 __new__:创建对象时候执行方法,单列模式会用到 __str__:当使用...•sort()与sorted()不同在于,sort在原位重新排列列表,sorted()产生一个新列表。...•sorted()适用于任何可迭代容器,list.sort()仅支持list(本身就是list一个方法),sorted使用频率比list.sort()更高些,所以Python中更高级排序技巧便通过sorted

    36152

    python 类

    __init__() print ChildA(),ChildB() 但是使用super好处,避免了书写父类名,主要用于多重继承,有降偶好处 然后init(),它类似与构造函数,在类创建对象时候使用...self不是代表类,而是代表实例。同时在继承时调用父类init()方法。 new() 函数只能用于从object继承新式类。 这里扯一嘴,什么新式类与旧式类?...== '__main__': de = Demo() __new__() - 如果new()返回,或返回错误,不会运行init(),但是如果写new...因为实例方法调用离不开实例,我们需要把实例自己传给函数,调用时候这样a.foo(x)(其实是foo(a, x)).类方法一样,只不过它传递不是实例,A.class_foo(x).注意这里...1.可变参数类型。 2.可变参数个数。

    1K30

    Python每日一题:__new__ 与 __init__

    答案要点: __new__() 一个静态方法,尽管并没有 @staticmethod 来修饰。它主要用于生成类实例对象,所以当执行 a = A() 时,会首先执行 __new__()。...这个方法有返回值,一般它返回值当前调用类实例对象。它定义如下: # __new__ 参数 类,一旦这个方法创建过实例对象后就会调用 __init__() object....__new__(cls[,...]) __init__ 在实例对象被创建之后才被调用,也就是在执行完 __new__ 之后。...它也可以用于在使用元类时重写,以便我们客制化类创建 首先,我们来看下第一个作用,比如我们有一种需求,一直要得到大写字符串,类似新增一种数据类型,它会一直返回字符串大写形式。...__init__(str.upper(value)) s = UpperStr("abc") print(s) # ABC 其次第二个作用,就是我们通过使用元类来构造类时,可以通过重载元类 __

    36810

    python面试题(持续更新)

    所以在多线程中,线程运行仍是有先后顺序,并不是同时进行。...*args和**kwargs主要用于函数定义,可以将不定量参数传递给一个函数 *args用来发送非键值对可变数量参数列表给一个函数 **kwargs用来将不定长度键值对作为参数传递给一个函数...,或者直接object__new__出来实例 3、__init__有一个参数self,就是这个__new__返回实例,__init__在__new__基础上可以完成一些其它初始化动作,__init...__不需要返回值 4、如果__new__创建当前类实例,会自动调用__init__函数,通过return语句里面调用__new__函数第一个参数cls来保证当前类实例,如果其他类类名,...with方法帮我们实现了finally中f.close 3、列表[1,2,3,4,5],请使用map()函数输出[1,4,9,16,25],并使用列表推导式提取出大于10数,最终输出[16,25]

    1.2K110

    python 魔法方法连载四 __new__()

    前言 在学习__new__(cls,[ *args]) 方法之前,我们知道,当实例化一个对象时,首先调用 __init__()方法初始化对象,但在我们学习了了__new__()魔法方法后,就会发现我们这种认知错误...__new__(cls,[ *args]) •__new__ 实例化对象调用第一个方法(不是__init__方法)•它第一个参数这个类(cls),其他参数直接传递给__init__方法....绝大多部分情况下,我们不需要重载__new__方法,但当继承一个不可变类如str,int类等,我们可以通过__new__方法来自定这些类实例化过程。...那现在想实现把实例对象时入参变成大写,如下所示: >>> a = str_cls('aaa') >>> print(a) AAA 如果我们只通过修改__init__方法实现不了该功能: ......__new__(cls,string) ... >>> a = str_cls('aaa') >>> print(a) AAA 对于这些不可变对象,我们只有通过__new__方法处理,才能得到我们想要结果

    37010

    60道Python常见面试题,做对80% Offer任你挑!

    所以在多线程中,线程运行仍是有先后顺序,并不是同时进行。...,__init__在__new__基础上可以完成一些其它初始化动作,__init__不需要返回值 4、如果__new__创建当前类实例,会自动调用__init__函数,通过return语句里面调用...__new__函数第一个参数cls来保证当前类实例,如果其他类类名,;那么实际创建返回就是其他类实例,其实就不会调用当前类__init__函数,也不会调用其他类__init__函数。...fn("two",2)因为字典在内存中可变数据类型,所以指向同一个地址,传了新额参数后,会相当于给字典增加键值对。...58、请将[i for i in range(3)]改成生成器 生成器特殊迭代器: 1、列表表达式【】改为()即可变成生成器; 2、函数在返回值得时候出现yield就变成生成器,不是函数了。

    1.1K30

    牛客网 python (1)

    __new__和__init__区别,说法正确? ...正确答案: A B C D    __new__一个静态方法,__init__一个实例方法 __new__方法会返回一个创建实例,__init__什么都不返回 只有在__new__返回一个cls...实例时,后面的__init__才能被调用 当创建一个新实例时调用__new__,初始化一个实例时用__init__ 根据官方文档: __init__当实例对象创建完成后被调用,然后设置对象属性一些初始值...__new__在实例创建之前被调用,因为它任务就是创建实例然后返回该实例,个静态方法。...即,__new__在__init__之前被调用,__new__返回值(实例)将传递给__init__方法第一个参数,然后__init__给这个实例设置一些参数。 8.

    96510

    分享 Python 常见面试题及答案(上)

    所以在多线程中,线程运行仍是有先后顺序,并不是同时进行。...return父类(通过super(当前类名, cls))__new__出来实例,或者直接object__new__出来实例 3、__init__有一个参数self,就是这个__new__返回实例...,__init__在__new__基础上可以完成一些其它初始化动作,__init__不需要返回值 4、如果__new__创建当前类实例,会自动调用__init__函数,通过return语句里面调用...__new__函数第一个参数cls来保证当前类实例,如果其他类类名,;那么实际创建返回就是其他类实例,其实就不会调用当前类__init__函数,也不会调用其他类__init__函数。...],并使用列表推导式提取出大于10数,最终输出[16,25] map()函数第一个参数fun,第二个参数一般list,第三个参数可以写list,也可以写,根据需求 ?

    1.3K50

    使用order by 排序后10 6 7 8 9 不是 6 7 8 9 10?

    问题 sql order by 排序后为什么 10 6 7 8 9 不是 6 7 8 9 10? 思路 在 SQL 中,ORDER BY 默认排序方式升序(从小到大)。...所以,如果您简单地使用 ORDER BY 对某个列进行排序,它会将数字按照升序排列,即: SELECT your_column FROM your_table ORDER BY your_column;...上面的语句会得到: 6 7 8 9 10 如果您得到排序结果 10, 6, 7, 8, 9,那可能是因为列数据类型被当作字符串类型而非数字类型来排序。...在字符串排序中,“10” 会在 “6” 前面,因为字符串排序按照字符字典顺序, “1” 字典顺序在 “6” 之前。...为了确保数字按照数值大小来排序,您需要确保排序数值类型(如 INT,BIGINT,DECIMAL 等)。

    23420

    Python 基础:类与函数

    “__new__”方法新式类特有的方法,通常情况下,__new__方法会创建返回cls(cls指代当前类)实例,然后调用该类”__init__”方法作为初始化方法,该方法接收这个实例(即self)...作为自己第一个参数,然后依次传入”__new__”方法中接收位置参数和命名参数;但是,如果”__new__”没有返回cls(即当前类)实例,那么当前类”__init__”方法不会被调用。...在继承时,传入哪个实例,就是那个传入实例,不是指定义了self实例 在描述符类中,self指的是描述符类实例 总结: self在定义时需要定义,但是在调用时会自动传入...__metaclass__属性 自定义元类 为什么要用metaclass类不是函数?...type实际上它自己元类,在纯Python环境中这可不是你能够做到,这是通过在实现层面耍一些小手段做到。其次,元类很复杂。对于非常简单类,你可能不希望通过使用元类来对类做修改。

    92390

    非常全通俗易懂 Python 魔法方法指南

    然而,当我们调用 x = SomeClass() 时候, __init__不是第一个被调用方法。事实上,第一个被调用 __new__ ,这个 方法才真正地创建了实例。...让我们近一步理解这三个方法: __new__(cls,[…) __new__ 对象实例化时第一个调用方法,它只取下 cls 参数,并把其他参数传给 __init__ 。...我不打算深入讨论 __new__ ,因为它并不是很有用, Python文档 中 有详细说明。 __init__(self,[…]) 类初始化方法。...: # 注意,我们只能使用 `__new__` ,因为str可变类型 # 所以我们必须提前初始化它(在实例创建时) if ' ' in word:...这个魔法方法可以被使用(毕竟,选择权在你自己),我推荐你使用它,因为它使用范围相对有限(通常我们想要在赋值时进行特殊操作,不是取值时),而且实现这个方法很容易出现Bug。

    1.9K32

    110道python面试题

    所以在多线程中,线程运行仍是有先后顺序,并不是同时进行。...__new__和__init__区别 __init__初始化方法,创建对象后,就立刻被默认调用了,可接收参数,如图 ?...,__init__在__new__基础上可以完成一些其它初始化动作,__init__不需要返回值 4、如果__new__创建当前类实例,会自动调用__init__函数,通过return语句里面调用...__new__函数第一个参数cls来保证当前类实例,如果其他类类名,;那么实际创建返回就是其他类实例,其实就不会调用当前类__init__函数,也不会调用其他类__init__函数。...69、请将[i for i in range(3)]改成生成器 生成器特殊迭代器, 1、列表表达式【】改为()即可变成生成器 2、函数在返回值得时候出现yield就变成生成器,不是函数了; 中括号换成小括号即可

    2.8K40

    Python常见编程基础问题总结

    为什么 Python 不提供函数重载 我们知道 函数重载 主要是为了解决两个问题。 可变参数类型。 可变参数个数。...__方法区别 __init__ 方法并不是真正意义上构造函数, __new__ 方法才是(类构造函数一种特殊成员函数,它会在每次创建类新对象时执行); __new__ 方法用于创建对象并返回对象...,当返回对象时会自动调用 __init__ 方法进行初始化, __new__ 方法比 __init__ 方法更早执行; __new__ 方法静态方法, __init__ 实例方法。...型变量 print(a) a = 'ABC' # a str型变量 print(a) Pyhon 这种变量本身类型固定,可以反复赋值不同类型变量称为动态语言,与之对应静态语言。...,它会根据对象(或类)类型不同表现出不同行为。

    1K20
    领券