【发布时间】:2018-04-17 09:25:55
【问题描述】:
几年来,我一直在继承tuple 或使用namedtuple,但现在我有一个用例,我需要一个可以用作弱引用的类。今天我学到了tuples don't support weak references。
还有其他方法可以在 Python 中创建具有固定属性集的不可变对象吗?我不需要元组的数字索引或可变宽度。
class SimpleThingWithMethods(object):
def __init__(self, n, x):
# I just need to store n and x as read-only attributes
... ??? ...
我想这引发了一个显而易见的问题,即为什么不可变; “Pythonic”代码通常只是假设我们在这里都是成年人,如果有破坏类不变量的风险,没有人会进入一个类并弄乱它的值。就我而言,我在库中有一个类,我担心最终用户会意外修改对象。与我一起工作的人有时会对我的代码做出错误的假设并开始做我没想到的事情,所以如果他们不小心修改了我的代码,我可以引发错误会更干净。
我并不担心防弹的不变性;如果有人真的很邪恶,想去修改东西,好吧,好吧,他们靠自己。我只是想防止意外修改我的对象。
【问题讨论】:
-
Raymond(在邮件中)建议的解决方法有什么问题?
-
"使用 has-a 关系而不是 is-a 关系创建自定义类。" -- (1) 我想用纯 Python 来做,(2),has-a 暗示自定义类包含我的真实类,但是自定义类不是不可变的,因为鸡蛋和鸡蛋 -- 如果我可以创建一个不可变的类,然后我就去做。
-
我想我也可以使用一个容器类来覆盖
__eq__和__hash__并委托给包含的对象。不确定这是否适用于弱引用。 -
stackoverflow.com/a/4854045/2289509 (cython) 怎么样
-
很有趣,但这在我的代码中依赖于 Cython,我想避免它。
标签: python python-2.7 oop tuples