【发布时间】:2019-05-15 07:05:23
【问题描述】:
所以我知道如何在 python 中像这样使变量“私有”:
class Foo:
def __init__(self):
self.__private = 'bar'
这“有效”而无效,如下所示:
foo = Foo()
'__private' in vars(foo) #False
'_Foo__private' in vars(foo) #True
现在,我知道这是在 python 中创建私有变量的方法,我喜欢这种方法。它允许您修改名称,这样子类就不会意外地覆盖它(因为它以类的名称开头),并且没有人会意外地使用它。它还使您能够更改私有变量如果您知道自己在做什么。此外,这是最好的方法,因为真正的私有变量是不可能的。
我是这么想的。
最近在看PEP 8,看到了这样一行:
我们在这里不使用术语“私有”,因为在 Python 中没有一个属性是真正私有的(通常没有不必要的工作量)。
此报价可在Designing for Inheritance section of PEP 8 中找到。
请注意“没有通常不必要的工作量”这句话。我现在确信必须有一种方法可以在 python 中获取真正的私有变量。我该怎么做?
我尝试过覆盖__getattribute__,但问题是无法判断呼叫是否来自班级内部(我知道)。
此外,__dict__ 属性在尝试执行此操作时很烦人,因为它包含对所有实例变量的引用。
我也想到了元类,但那些似乎和__getattribute__有同样的问题。
想法?
注意: 我知道在 python 中创建真正私有变量的任何方法都应该永远在生产代码中完成。我只是想知道它是如何完成的。
【问题讨论】:
-
如果你真的想要隐私,你考虑过编译你的代码吗?根据您将其编译成的内容,确定的用户可能(或可能不会!)仍然能够对源代码进行去混淆处理,但它非常接近
-
@CharlesLandau 问题是关于私有(如在公共、私有、在 C++/Java 世界中受保护)属性,而不是源代码隐私。
-
@CharlesLandau 我明白了,但问题是扩展基类,我看不到如何从编译的可执行文件扩展类。无论如何,通过
dir(classname)调用仍然可以轻松绕过它。 -
私有属性来自于编写一个 C 扩展,它可以让您以一种无法从外部代码访问的方式存储数据,除非通过手动内存操作的大锤方法。 C 扩展需要大量工作。