当前位置: 首页 > 面试题库 >

如何为不可变类型实现“ __iadd __()”?

太叔鸿博
2023-03-14
问题内容

我想继承不可变类型或实现自己的一种,其行为类似于int以下控制台会话所示:

>>> i=42
>>> id(i)
10021708
>>> i.__iadd__(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute '__iadd__'
>>> i += 1
>>> i
43
>>> id(i)
10021696

毫不奇怪,int对象没有__iadd__()方法,但应用于对象+=并不会导致错误,相反,它显然会创建一个新对象,int并且还以某种方式神奇地将其重新分配为扩充赋值语句中给出的名称。

是否可以创建一个内置的不可变类的用户定义类或子类,并且可以这样做?


问题答案:

使用的返回值__iadd__()。您无需返回要添加到的对象;您可以创建一个新的并将其返回。实际上,如果对象是不可变的,则必须 这样 做。

import os.path

class Path(str):
    def __iadd__(self, other):
        return Path(os.path.join(str(self), str(other)))

path = Path("C:\\")
path += "windows"

print path


 类似资料:
  • 本文向大家介绍如何在 Java 中实现不可变类,包括了如何在 Java 中实现不可变类的使用技巧和注意事项,需要的朋友参考一下 前言 面向对象的编程通过封装可变动的部分来构造能够让人读懂的代码,函数式编程则是通过最大程度地减少 可变动的部分来构造出可让人读懂的代码。 — Michael Feathers,Working with Legacy Code 一文的作者 在这一部分中,我讨论的是函数式编

  • 问题内容: 我对什么是不可变类型感到困惑。我知道该float对象被认为是不可变的,在我的书中有这样的例子: 由于类的结构/层次结构,这是否被认为是不可变的?意思float是在类的顶部,是它自己的方法调用。类似于此类示例(即使我的书说的dict是可变的): 可变的东西在类内部具有方法,例如以下类型: 另外,对于最后一个,如果我将这种类型的set传递给它: 不调用该example方法,它返回一个字典。

  • 本文向大家介绍Python的可变类型和不可变类型?相关面试题,主要包含被问及Python的可变类型和不可变类型?时的应答技巧和注意事项,需要的朋友参考一下 可变数据类型:列表、字典、可变集合 不可变数据类型:数字、字符串、元组、不可变集合    

  • 我不知道如果没有其他变量告诉我哪个更大,我怎么能比较两个可比较的对象。问题是:创建一个名为Max的类,该类提供一个名为Max的类方法。Max将两个参数用于可以比较的对象,即实现如上所示的Java Compariable接口的对象。它返回对较大值的引用。如果两个对象相等,则应返回第一个对象。实现的可比性取决于每个类,您的方法将在多个不同类型的对象上调用。 它在接口中提供了int compareTo(

  • 目前,我在为RecycleView定制多视图类型。我找到了很多解决这个问题的方法,但我会分享我的方法。 不同的是使用定义ViewType。 更多细节请参见我的答案。(只想分享)。

  • 我理解不可变意味着它是一个实例化后不会改变状态的对象。但在这行代码中,我看不到数组值何时被声明为Final。这个类是不变的吗?谁能解释一下怎么找到答案吗。谢谢