gpt4 book ai didi

python - Python 中的 __iadd__ 具有只读属性

转载 作者:行者123 更新时间:2023-11-30 22:13:56 27 4
gpt4 key购买 nike

This question处理 Python 读写属性的 __iadd__。但是,我正在努力寻找只读属性的解决方案。

在我的 MWE 中,我们有一个只读属性 Beta.value,返回一个 Alpha 实例。我想我应该能够在 Beta.value 上使用 __iadd__ 因为返回的值就地发生了变化,并且没有进行任何更改Beta 本身,非常类似于其前面的“beta.value.content +=”行。但是,以下代码会崩溃并显示 AttributeError: can't set attribute

是否可以在只读属性上使用__iadd__

class Alpha:
def __init__( self, content : int ) -> None:
self.content : int = content


def __iadd__( self, other : int ) -> "Alpha":
self.content += other
return self


class Beta:
def __init__( self ):
self.__value: Alpha = Alpha(1)


@property
def value( self ) -> Alpha:
return self.__value


beta = Beta()
beta.value.content += 2
beta.value += 2

最佳答案

可以通过为仅接受原始对象的属性添加特殊的 setter 来欺骗它。

Beta 将变为:

class Beta:
def __init__( self ):
self.__value: Alpha = Alpha(1)

def _get_val( self ) -> Alpha:
return self.__value
def _set_val( self, val: Alpha):
if not (val is self.__value): # only accept the existing object
raise AttributeError("can't set attribute")
value = property(_get_val, _set_val)

使用该技巧,您可以成功使用:

>>> beta = Beta()
>>> beta.value.content
1
>>> beta.value = Alpha(2) # property IS read only
Traceback (most recent call last):
File "<pyshell#86>", line 1, in <module>
beta.value = Alpha(2)
File "<pyshell#78>", line 9, in _set_val
raise AttributeError("can't set attribute")
AttributeError: can't set attribute
>>> beta.value.content # and was not changed by an assignment attempt
1
>>> beta.value += 2 # but accepts augmented assignment
>>> beta.value.content
3

关于python - Python 中的 __iadd__ 具有只读属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50643742/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com