我知道用双下划线__
前缀声明的类的属性在类定义之外可能可见,也可能不可见。由于我们仍然可以通过object._className__attrName
访问这些属性。
class A:
def __init__(self):
self.a = 1
self.b = 2
----
----
self.z = 26
self.catch = 100
现在要保护除
catch
属性之外的所有属性,我必须用双下划线声明它们,这很困惑。我可以在类定义中说只能在类外访问self.catch
吗?很抱歉,如果在其他地方回答了这个问题,或者前面已经讨论过了。
最佳答案
是的,可以将私有(private)数据隐藏在一个闭包中-至少,如果有一种方法可以从private
外部访问make_A
,我还没有找到它:
def make_A():
private = {
'a' : 1,
'b' : 2,
'z' : 26,
}
class A:
def __init__(self):
self.catch = 100
private['a'] = 2 # you can modify the private data
def foo(self):
print(private['a']) # you can access the private data
return A
A = make_A()
a=A()
a.foo()
# 2
请注意
private
不在dir(a)
中print('private' in dir(a))
# False
尽管这是可行的,但我认为这不是在Python中进行编程的推荐方式。
上面,
private
由A
的所有实例共享。要按实例使用私有(private)数据,请将self
添加到dict键:def make_A():
private = {}
class A:
def __init__(self):
self.catch = 100
private[self,'a'] = 1 # you can modify the private data
private[self,'b'] = 2
private[self,'z'] = 26
def foo(self):
print(private[self,'a']) # you can access the private data
return A