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

发布于 2021-01-29 14:09:57

我想继承不可变类型或实现自己的一种,其行为类似于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并且还以某种方式神奇地将其重新分配为扩充赋值语句中给出的名称。

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

关注者
0
被浏览
134
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    使用的返回值__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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看