【问题标题】:True privateness in PythonPython 中的真正隐私
【发布时间】:2011-11-19 09:01:02
【问题描述】:

PEP 8 声明(强调我的):

我们在这里不使用“私有”这个词,因为在 Python 中没有一个属性是真正私有的(没有通常不必要的工作量)。

我猜它指的是用其他语言定义实际的类,然后只将公共成员暴露给解释器。有没有其他方法可以在 Python 中实现真正的隐私?

我只是出于好奇。

【问题讨论】:

  • @JBernardo 但这并没有真的使它成为私有的,不是吗?它只是让你更难到达。
  • 我不相信有办法在 python 中实现真正的隐私。见这里:stackoverflow.com/questions/70528/…
  • 您可能不想阻止访问...只需阻止用户设置您的数据。这就是为什么property 很好。
  • @JBernardo 但这并不有趣。 :P 正如我所说,出于好奇,我想知道,我喜欢 Python 的“我们都是成年人”的态度。
  • @JBernardo 您仍然必须将实际信息存储在某个地方,这并不是真正的私有,因此属性并不会真正阻止设置数据。

标签: python private


【解决方案1】:

不,在 Python 中没有什么是真正私有的。

如果你知道方法名,你可以得到它。

我认为您可能会想出一个聪明的 hack,但它只是 - 一个 hack。该语言中不存在此类功能。

【讨论】:

  • 您可以检查堆栈并阻止访问:link:D
  • @JBernardo,您可以破坏堆栈并伪造它检查的内容,以便您获得访问权限。
  • @Aaron 那只是个玩笑......对于真正的私有方法,您需要在此之上使用密码学。大声笑
  • @JBernardo,嗯?密码学会做什么?只要 something 可以解密,您仍然可以恢复用于解密的方法。
  • @JBernardo,据我了解,Stack Overflow 是一个针对实际问题的严肃讨论论坛。您所说的内容可能会被误解为严肃的答案,因此没有用处。
【解决方案2】:

(注意:这不是 C++/C#/Java 类型私有意义上的“私有”,但很接近)

对于一个类,您可以在变量前加上'__'。这将导致 Python 将其命名为 mangle,这样您就不会意外地从类外部调用它。例如:

class Test(object):
    def __init__(self):
        self.__number = 5

a = Test()
print a.__number # name error!

另一方面,这并不是真正私有的。您可以通过以下方式访问该号码:

print a.__Test_number

但它会防止意外错误,无论如何都应该使用它。如果它以 '__' 为前缀并且有人使用该代码,那么如果该代码稍后发生故障,他们的错(他们被警告)。

【讨论】:

    【解决方案3】:

    没有真正的隐私。您能做的最好的事情就是混淆变量名,然后创建 getter/setter 或属性。

    我能想到的唯一方法是在每次需要访问该变量时读取/写入文件。

    您也可以用另一种语言编写一个只响应某些类的程序。不过,不知道该怎么做。

    【讨论】:

    • 什么都没有。不过,这是我能想到的最好方法。
    猜你喜欢
    • 2019-05-15
    • 2014-11-20
    • 2021-07-28
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    相关资源
    最近更新 更多