所以我知道如何在 python 中使变量“私有”,如下所示:
class Foo:
def __init__(self):
self.__private = 'bar'
这“有效”,但无效,如下所示:
foo = Foo()
'__private' in vars(foo) #False
'_Foo__private' in vars(foo) #True
现在,我明白这是在 python 中创建私有变量的方法I like这边走。它允许您修改名称,这样子类就不会意外地覆盖它(因为它以类的名称开头),并且没有人会意外地使用它。它还使您能够更改私有变量如果你知道自己在做什么。而且,这是最好的方法,因为真正的私有变量是不可能的。
或者说我是这么想的。
最近,我在读PEP 8 https://www.python.org/dev/peps/pep-0008/我看到了这一行:
我们在这里不使用术语“私有”,因为在 Python 中没有属性是真正私有的(通常没有不必要的工作量)。
这段引用可以在PEP 8 的“继承”部分的设计 https://www.python.org/dev/peps/pep-0008/#designing-for-inheritance.
请注意“没有通常不必要的工作量”这句话。我现在确信有must是在 python 中获取真正私有变量的一种方法。我该怎么做呢?
我尝试过覆盖__getattribute__
,但问题是没有办法判断调用是否来自类内部(据我所知)。
另外,__dict__
尝试执行此操作时,属性很烦人,因为它保存对所有实例变量的引用。
我也想到了元类,但那些似乎有同样的问题__getattribute__
.
想法?
Note:我知道任何在 python 中创建真正私有变量的方法都应该never在生产代码中完成。我只是想知道如何could做完了。