我想继承不可变类型或实现自己的一种,其行为类似于int以下控制台会话所示:
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__()
+=
是否可以创建一个内置的不可变类的用户定义类或子类,并且可以这样做?
使用的返回值__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