【问题标题】:simulate private variables in python [duplicate]在python中模拟私有变量[重复]
【发布时间】:2011-03-18 17:01:44
【问题描述】:

可能重复:
private members in python

我真的想隐藏几个变量,因为它们不属于我的班级。此外,所有此类未记录的变量都会使继承变得无用。

你如何隐藏这些你不想在你的对象之外显示的变量?

为了澄清我为什么需要私有变量,首先举一个例子,其中无法隐藏变量只是一种不便,然后是另一个真正有问题的例子:

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:也许你可以告诉我们更多关于你的用户的信息,以及他们正在使用什么样的“雷达”。

标签: python oop private


【解决方案1】:

来自Python docs

在 Python 中不存在只能从对象内部访问的“私有”实例变量。但是,大多数 Python 代码都遵循一个约定:前缀为下划线的名称(例如 _spam)应被视为 API 的非公共部分(无论是函数、方法还是数据成员) .它应被视为实现细节,如有更改,恕不另行通知。

【讨论】:

  • mmmmmm 20 秒太迟了:)
  • 我很确定拜尔斯先生生活在比我们早 10 秒的平行宇宙中。 ;)
  • 拜尔斯在我之前回答了这个问题,这很有趣,元物理学在起作用..
【解决方案2】:

Python documentation 中涵盖了私有变量:

9.6。私有变量

在 Python 中不存在只能从对象内部访问的“私有”实例变量。但是,大多数 Python 代码都遵循一个约定:前缀为下划线的名称(例如 _spam)应被视为 API 的非公共部分(无论是函数、方法还是数据成员) .它应被视为实现细节,如有更改,恕不另行通知。

摘要:在名称前使用下划线。

【讨论】:

    猜你喜欢
    • 2017-04-08
    • 2023-04-02
    • 2018-08-24
    • 2015-01-21
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    相关资源
    最近更新 更多