我知道用双下划线__前缀声明的类的属性在类定义之外可能可见,也可能不可见。由于我们仍然可以通过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中进行编程的推荐方式。

上面,privateA的所有实例共享。要按实例使用私有(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

10-06 14:30
查看更多