面向对象(1)____私有公有 访问限制

class Demo1():
    aa=123
    def __init__(self,name,score):
        self.name = name 
        self.score = score
    
    def func1(self):
        print(self.name,self.score)
class Demo2():
    __aa=123
    def __init__(self,name,score):
        self.__name = name 
        self.__score = score
    
    def func1(self):
        print(self.__name,self.__score)    

if __name__ =="__main__":
    demo1 = Demo1('jack',100)
    demo2 = Demo2('tom',200)
    demo1.func1()   # jack 100
    demo2.func1()   # tom 200
    print(demo1.name) #外部访问实例变量成功   public
    print(demo1.aa) #访问类属性成功          public
    #但是加了__双下划线的属性变量就变成私有的了 private 外部无法调用
    print(demo2.__aa)  #报错没有属性__aa
    print(demo2.__name) #报错没有属性__name

    #但是如果一定要访问还是能访问到的,但是不推荐  instance._classname__私有属性名
    print(demo2._Demo2__aa) #123

如果还是需要访问private变量,建议定义 get set方法(类似于java),这样对数据也有校验,例子如下:

class Student():
    def __init__(self):
        self.__score = None
    @property
    def score(self):
        return self.__score
    @score.setter
    def score(self,value):
        ####   这里可以加入赋值逻辑
        if not isinstance(value,int):
            raise ValueError('分数必须为整数')
        if value>100 or value<0:
            raise ValueError('分数不是合理区间')
        else:
            self.__score = value
    @score.deleter
    def score(self):
        del self.__score

if __name__ =="__main__":
    a = Student()
    a.score = 56    #正常访问到setter方法
    print(a.score) # 正常访问到__score变量  56
有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,
但是,请把我视为私有变量,不要随意访问”。
原文地址:https://www.cnblogs.com/alantammm/p/13679732.html