隐藏在python中的信息

时间:2010-05-22 12:18:01

标签: python

python教程中的

补充说python无法隐藏其他类的属性。有些东西,比如C ++或java中的私有数据。但我也知道我们可以使用_或__将一些变量设置为私有变量,但它不是enogh。如果没有任何事情要做,我认为这是一个弱点。

4 个答案:

答案 0 :(得分:4)

Python中的数据封装由约定和同行评审强制执行。令人惊讶的是,让每个属性都有效地公开并没有给大多数Python程序员带来问题。

答案 1 :(得分:4)

这是Python的哲学的一部分。它基本上相信你是明智的,并且对以下划线开头的任何事情都要谨慎。如果你真的想要隐藏状态,那么没有人可以触摸它,你可以这样做:

def fort_knox():
    # A very private variable
    gold = [0]

    class impl(object):
        def add_gold(self, amt):
            gold[0] += amt

        def remove_gold(self, amt):
            raise Exception('No withdrawals!')

        def count_gold(self):
            return gold[0]

    return impl()

答案 2 :(得分:4)

在元素名称的开头使用下划线或方法向读者发出信号,表明他们正在查看的是“内部实现细节”。如果他们想要使用它,他们可以,但很可能新版本的类不会保留内部方法或元素的API(呃,“插槽”,我猜,实例变量)。 / p>

通过编译器强制保证什么是可见的和不可见的,你更确定外部各方不看内部位,但即使在C ++中,访问私有东西并不难。

在实践中,只要你相信人们不做愚蠢的事情就没有问题,“这是内部的,不要触摸”作为礼貌提醒而不是强制执行。

答案 3 :(得分:1)

你是对的,_foo约定不足以使数据私有化;它不应该是!信息隐藏不是Python设计的一部分。在Python中编写程序时,您依赖于调用者的良好举止,根据命名约定和文档保留内部单元。不要试图施加比这更多的控制; 我们都同意成年人

有一种惯例,即使用单个前导下划线来命名_foo等内部使用方法;这提供了更多的文档目的。 Python名称 - mangles __foo属性。有些人认为这会使它们更加私密,但它并不会使它们成为私有的,尽管它确实使您的类更难以使用,扩展和测试。我从不使用它们。