在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。
从Student类的定义来看,外部代码还是可以*地修改一个实例的name
、score
属性
# class Student(object): # def __init__(self,name,score,ww): # self.name=name # self.score=score # self.ww=ww # def prins(self): # print('%s:%s:%s'%(self.name,self.score,self.ww)) # bart=Student('wang',99,'yiban') #输入实例 # bart.name='zhang'#将实例中的wang改为zhang # bart.prins()
如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__
,在Python中,实例的变量名如果以__
开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问
# class Student(object): # def __init__(self,name,score,ww): # self.__name=name # self.__score=score # self.__ww=ww # def prins(self): # print('%s:%s:%s'%(self.__name,self.__score,self.__ww)) # bart=Student('wang',99,'yiban') # bart.__name='zhang' #虽然可以运行但不是self.__name=name
# bart.prins()
如果要修改实例的内容可以在类中写一个方法
# class Student(object): # def __init__(self,name,score,ww): # self.__name=name # self.__score=score # self.__ww=ww # def prins(self): # print('%s:%s:%s'%(self.__name,self.__score,self.__ww)) # def cc(self,gg): # self.__name=gg # bart=Student('wang',99,'yiban') # bart.cc('zhang') # bart.prins()
_name
是因为Python解释器对外把__name
变量改成了_Student__name
,所以,仍然可以通过_Student__name
来访问__name
变量。
但是强烈建议你不要这么干,因为不同版本的Python解释器可能会把__name
改成不同的变量名