python – 如何使只读属性可变?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 如何使只读属性可变?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1915字,纯文字阅读大概需要3分钟。
内容图文
![python – 如何使只读属性可变?](/upload/InfoBanner/zyjiaocheng/810/afe3ebfc0c1045788737370a33dbbd20.jpg)
我有两个类,一个是“就地操作符”覆盖(比如说=),另一个是通过@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
从我发现这是预期的,因为它试图设置所有者的财产.有没有办法防止将属性设置为新对象,同时仍允许我(就地)修改它后面的对象,或者这只是语言的怪癖?
(另请参阅this question,但我试图采用另一种方式,最好不要回到旧式类,因为最终我希望它能与Python 3一起使用.)
与此同时,我用一种方法做了同样的事情.
class MyValue(object):
# ...
def add(self, other):
self.value += other
>>> owner = MyOwner()
>>> owner.what.add(2)
>>> print(owner.what)
42
解决方法:
这是语言的怪癖; object = value操作转换为:
object = object.__iadd__(value)
这是必要的,因为并非所有对象都是可变的.你的是,并且正确地返回self,导致上述操作的赋值部分的虚拟无操作.
在您的情况下,有问题的对象也是一个属性,因此执行以下操作:
owner.what = owner.what.__iadd__(2)
除了避免引用o??bject.what在左侧(如tmp = owner.what; tmp = 2),有一种方法可以干净利落地处理它.
您可以轻松地检测到属性的赋值涉及相同的对象和门:
class MyOwner(object):
def __init__(self):
self._what = MyValue(40)
@property
def what(self):
return self._what
@what.setter
def what(self, newwhat):
if newwhat is not self._what:
raise AttributeError("can't set attribute")
# ignore the remainder; the object is still the same
# object *anyway*, so no actual assignment is needed
演示:
>>> owner = MyOwner()
>>> owner.what
40
>>> owner.what = 42
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 24, in what
AttributeError: can't set attribute
>>> owner.what += 2
>>> owner.what
42
内容总结
以上是互联网集市为您收集整理的python – 如何使只读属性可变?全部内容,希望文章能够帮你解决python – 如何使只读属性可变?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。