代码之家  ›  专栏  ›  技术社区  ›  Cheery

在python中模拟私有变量[重复]

  •  5
  • Cheery  · 技术社区  · 16 年前

    可能重复:
    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()
    

    所以说我希望有一天改变实现。很有可能它会破坏某些东西,除非我真的将实现细节隐藏起来。

    我会尽可能的接受它。“任何人”都可以从我的实现细节中找到一个有用的东西并使用它,即使我强烈反对这样做!说“不,它不在那儿,试试别的就容易多了。”

    2 回复  |  直到 13 年前
        1
  •  15
  •   Mark Byers    16 年前

    私有变量包含在python中 documentation :

    9.6。私有变量

    __private_不能访问的实例变量,除非对象内部不存在于python中。但是,大多数python代码后面都有一个约定:以下划线(例如“spam”)作为前缀的名称应被视为API的非公共部分(无论它是函数、方法还是数据成员)。应将其视为实施细节,如有更改,恕不另行通知。

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

        2
  •  11
  •   DrDee    16 年前

    Python docs :

    __private_不能访问的实例变量,除非对象内部不存在于python中。但是,大多数python代码后面都有一个约定:以下划线(例如“spam”)作为前缀的名称应被视为API的非公共部分(无论它是函数、方法还是数据成员)。应将其视为实施细节,如有更改,恕不另行通知。