python中的信息隐藏

python中的信息隐藏,python,Python,在python教程中,添加了python不能对其他类隐藏其属性。有些东西,比如C++或java中的私有数据……但是我知道我们可以使用“或”来将一些变量设置为私有变量,但它并不重命名。我认为这是一个薄弱环节,如果它不是做任何事情的话。Python中的数据封装是通过约定和同行评审来实现的。令人惊讶的是,让每个属性有效地公开并没有给大多数Python程序员带来问题。这是Python哲学的一部分。它基本上相信你是明智的,对任何以下划线开头的事情都要小心谨慎。如果您真的想隐藏状态,这样就没有人可以触摸它,

在python教程中,添加了python不能对其他类隐藏其属性。有些东西,比如C++或java中的私有数据……但是我知道我们可以使用“或”来将一些变量设置为私有变量,但它并不重命名。我认为这是一个薄弱环节,如果它不是做任何事情的话。

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

这是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()

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

<> P>通过编译器强制保证什么是不可见的,你可以更确信外部方不在查看内部的比特,但是即使在C++中,访问私有的东西也不是那么难。
实际上,只要你相信人们不会做愚蠢的事情,“这是内部的,不要碰”作为礼貌的提醒而不是强制执行是没有问题的。

你是对的,
\u foo
约定不足以使数据私有化;这是不应该的!信息隐藏不是Python设计的一部分。在用Python编写程序时,您需要依靠调用方的良好方式,根据命名约定和您的文档,将内部内容放在一边。不要试图施加比这更多的控制;我们都是同意的成年人


有一种惯例,用一个前导下划线命名内部使用方法,如
\u foo
;这比其他任何东西都更适合于文档目的。Python名称会破坏
\uuufoo
属性。有些人认为这会使它们更私密,但这并不会使它们更私密,尽管这会使您的类更难使用、扩展和测试。我从不使用它们。

什么是“如果没有什么事情可以做的话,我想这是一个星期。”意思是?马塞洛:我想可能是“如果没有办法隐藏信息,我认为它很弱”。@Marcelo Cantos:也许是一个弱点/劣势?像“没有真正的私有成员是Python的缺点之一”(但是C++也是如此,在这里你可以简单地说<代码>定义私有的公共代码/代码>。)阿里:Python对程序员施加了很少的限制。当然,您不应该依赖于实现细节和未记录的特性,但对于每种语言都是如此。Python不强制执行这些限制通常并不坏,因为软件总是无法强制执行其他更复杂的限制。程序员负责编写合理的代码,而不是技术。你认为你是从哪个邪恶的程序员那里保护你的代码的,为什么他们会对你的代码库有写访问权?如果只是你和你的团队在做这件事,你肯定可以同意不从外部访问前缀变量,不是吗?
lol.fort_knox().add_gold.im_func.func_closure[0]。cell_contents->[0]
@Longpoke:cuite。我想诺克斯堡并不像我们所相信的那样难以逾越。永远不要直接提出异常,因为它不会被正常捕获。此外,在C++中隐藏机制不提供对实现更改的封装,因此piml习惯用法。