【发布时间】:2013-01-14 18:22:31
【问题描述】:
创建一个实例的属性不能从类外部更改的类最方便的方法是什么(您仍然可以获取值),因此可以在类的方法内调用self.var = v,而不是在类外调用ClassObject().var = v?
我尝试过使用__setattr__(),但如果我覆盖它,name 属性将无法在__init__() 方法中启动。唯一的方法是覆盖__setattr__() 并使用object.__setattr__(),我现在正在这样做:
class MyClass(object):
def __init__(self, name):
object.__setattr__(self, "name", name)
def my_method(self):
object.__setattr__(self, "name", self.name + "+")
def __setattr__(self, attr, value):
raise Exception("Usage restricted")
现在这个解决方案有效,已经足够了,但我想知道是否有更好的解决方案。这个问题是:我仍然可以从课堂外的任何地方拨打object.__setattr__(MyClass("foo"), "name", "foo_name")。
有什么方法可以完全防止将变量设置为类外的任何内容?
编辑:愚蠢的我更不用说我不是在这里寻找property,你们中的一些人已经回答了,但这对我来说还不够,因为它会使self._name 可变。
【问题讨论】:
-
不,没有。无论如何,不是在纯 Python 中。为什么需要这个?
-
不可能,但值得一问的是,为什么你甚至想要做这样的事情?
-
也许我需要一个只读属性。一个不错的例子是
STEAM_ID,以防你们使用过 Steam。 -
不,您不需要只读属性。从来没有(我的意思是)任何理由完全阻止设置属性。使用
@property将表明您不应该这样做,这就是您需要的所有“保护”。 -
如果您从来不需要它,这并不意味着其他任何人都不需要它。我有,如果你不同意,你就知道不够。
标签: python class methods python-3.x instance