"in-place operator"재정의 (예 : +=
)와 첫 번째 인스턴스를 @property
을 통해 노출하는 두 가지 클래스가 있습니다. (참고 :이 크게 문제가 재생 최소 내 실제 코드에서 간단입니다.)읽기 전용 속성을 변경할 수있게하려면 어떻게해야합니까?
class MyValue(object):
def __init__(self, value):
self.value = value
def __iadd__(self, other):
self.value += other
return self
def __repr__(self):
return str(self.value)
class MyOwner(object):
def __init__(self):
self._what = MyValue(40)
@property
def what(self):
return self._what
지금, 나는이 노출 된 재산이 연산자를 사용하려고하면
>>> owner = MyOwner()
>>> owner.what += 2
AttributeError: can't set attribute
내가 찾은 바에 따르면이 속성은 owner
에 설정하려고하기 때문에 예상됩니다. 을으로 설정하는 것을 방지 할 수있는 방법이 있습니까? (내부에서) 수정하려면 개체를 수정 하시거나 그냥 언어의 단점입니까?
(결국 내가 파이썬 3. 작업하려는 때문에 내가은 이전 스타일의 클래스에 복귀하지 않고 바람직 , 다른 길을 갈려고도 this question을 볼 수 있지만) 그동안 나는 같은 일을하는 방법으로이 문제를 해결했습니다.
class MyValue(object):
# ...
def add(self, other):
self.value += other
>>> owner = MyOwner()
>>> owner.what.add(2)
>>> print(owner.what)
42
다른 해결 방법 :'온도 = owner.what; temp + = 2', [owner.what] [0] + = 2'로 표시됩니다. –
사용자 코드에서 "hackish"부분을 지키고 싶습니다. 그래서 @ Martijn의 대답으로 갈 것이지만, 아이디어에 감사드립니다. 그들은 다른 것들을 위해 유용 할 수 있습니다. 나는 그들이 매우 간결하다는 것을 좋아한다 (특히 두 번째 :). – criptych