面向对象(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,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,
但是,请把我视为私有变量,不要随意访问”。