我一直在继承tuple或使用namedtuple幸福几年,但现在我有一个用例,我需要一个可以用作弱指示物的类.今天我学会了tuple不支持弱引用.
是否有另一种方法可以在Python中使用一组固定的属性创建不可变对象?我不需要元组的数字索引或可变宽度.
class SimpleThingWithMethods(object):
def __init__(self, n, x):
# I just need to store n and x as read-only attributes
... ??? ...
Run Code Online (Sandbox Code Playgroud)
我想这引起了一个明显的问题:为什么不可改变; "Pythonic"代码通常只是假设我们都是这里的成年人,如果它有可能破坏类不变量,那么没有一个心智正常的人会进入一个阶级并且使用它的值.在我的情况下,我在库中有一个类,我担心最终用户意外修改对象.我工作的人有时会对我的代码做出错误的假设并开始做我没想到的事情,所以如果我不小心修改我的代码就会引发错误,那就更清晰了.
我不太担心防弹不变性; 如果某个人真的是邪恶的想要修改的东西,那么,好吧,他们是独立的.我只想让你不小心修改我的对象.
参加以下课程
class Person(object):
def __init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name
Run Code Online (Sandbox Code Playgroud)
如何防止以下使用?
p1 = Person('Foo', 'Bar')
p1.firstname='Fooooooo'
Run Code Online (Sandbox Code Playgroud)
上面的代码将在Python中成功执行,但是,使用属性的名称进行了错误,即它_在first和之间缺失name
更新:这听起来像"猴子修补",我为什么要这样做?
我的目的是简单地帮助避免用户设置错误的属性,让代码执行,并看到意外的行为,而不是立即意识到错误.
Pythonic的推荐方式是什么?
拥有类 C 的实例 c,我想让 c 不可变,但 C 的其他实例不必这样做。
有没有一种简单的方法可以在 python 中实现这一点?
我在这里阅读了很多关于这个主题的内容,但我仍然找不到合适的答案。我有一个类:
class A(object):
def __init__(self, first, second):
self.first = first
self.second = second
def __eq__(self, other):
return ****
def __str__(self):
return *****
def __repr__(self):
return ****
a = A("a", "b")
Run Code Online (Sandbox Code Playgroud)
例如,我如何禁止 a.first = "c" ?
我的问题很简单,我有:
class upperstr(str):
def __new__(cls, arg):
return str.__new__(cls, str(arg).upper())
Run Code Online (Sandbox Code Playgroud)
为什么,如果我的__new__()方法是直接使用inmutable类型(str)的实例,我的新类型(upperstr)的实例是可变的?
>>> s = str("text")
>>> "__dict__" in dir(s)
False
>>> s = upperstr("text")
>>> "__dict__" in dir(s)
True
Run Code Online (Sandbox Code Playgroud)
如果我只重写__new __()方法,解释器在什么阶段将__dict__属性设置为upperstr intances?
谢谢!