【发布时间】:2011-03-18 17:01:44
【问题描述】:
我真的想隐藏几个变量,因为它们不属于我的班级。此外,所有此类未记录的变量都会使继承变得无用。
你如何隐藏这些你不想在你的对象之外显示的变量?
为了澄清我为什么需要私有变量,首先举一个例子,其中无法隐藏变量只是一种不便,然后是另一个真正有问题的例子:
class MyObject(object):
def __init__(self, length):
self.length = length
def __len__(self):
return length
item = MyObject(5)
item.length
len(item)
所以我有两种方法可以在这里访问项目的“长度”。这只是一种不便,并没有什么可怕的。
from wares import ImplementationSpecific
class MyThing(object):
def __init__(self):
self.__no_access_even_if_useful = ImplementationSpecific()
def restricted_access(self):
return self.__no_access_even_if_useful.mutable_value
thing = MyThing()
thing.restricted_access()
thing._MyThing__no_access_even_if_useful.something_useful_for_someone()
假设有一天我想更改实现。除非我真的隐藏了实现细节,否则它很有可能会破坏某些东西。
我会接受它,因为任何人都可以编程。 “任何人”都可以从我的实现细节中找到有用的东西并使用它,即使我强烈反对这样做!直接说:“不,它不存在,试试别的。”会容易得多。
【问题讨论】:
-
你不希望变量继承,对吗?
-
Python 不像某些语言那样做束缚和支配。如果您无法阻止自己使用
_method或_datum(见下文 DrDee),那么您应该得到(或没有得到(或破坏))。 -
你无法避免继承属性。您只能表明您不应该与他们混淆(通过使用此处实际答案中给出的前导下划线。)
-
@msw +1 在评论中使用“束缚”和“支配”。
-
@Cheery:也许你可以告诉我们更多关于你的用户的信息,以及他们正在使用什么样的“雷达”。