1.前言类内部可以有属性和方法,外部代码可以通过直接调用实例变量来操作数据。这样就隐藏了内部的复杂性。逻辑。2.案例分析从Teacher类的定义来看,外部代码仍然可以随意修改实例的name和score属性。classTeacher(object):def__init__(self,name,score):self.name=nameself.score=scoredefprint_score(self):print('%s:%s'%(self.name,self.score))defget_grade(self):ifself.score>=90:return'A'elifself.score>=60:return'B'else:return'C'bart=Teacher('BartSimpson',98)lisa=Teacher('LisaSimpson',87)bart.score=59print(bart.score)print('bart.score=',bart.score)运行结果:如果要防止内部属性被外部访问,可以在名称前加两个下划线该物业。在Python中,如果实例的变量名以开头,则成为私有变量(private),只能在内部访问,不能在外部访问。因此,Teacher更改了Teacher类:classTeacher(object):def__init__(self,name,score):self.__name=nameself.__score=scoredefprint_score(self):print('%s:%s'%(self.__name,self.__score))修改后,外部代码没有变化,但是不能再从外部访问实例变量.name和实例变量.score:bart=Teacher('BartSimpson',98)print(bart.__name)注意:它保证了外部代码不能随意修改对象的内部状态,这样通过访问限制的保护,代码更加健壮。但是如果外部代码想要获取姓名和分数怎么办?可以在Teacher类中添加get_name和get_score方法:classTeacher(object):defget_name(self):returnsself.__namedefget_score(self):returnsself.__score如果要允许外部代码如何修改分数?您可以将set_score方法添加到Teacher类中。classTeacher(object):defset_score(self,score):self.__score=score原来那种直接通过bart.score=59就可以修改了,为什么要定义一个这么麻烦的方法呢?因为在方法中,可以做参数检查,避免传入无效参数:classTeacher(object):defset_score(self,score):if0<=score<=100:self.__score=scoreelse:raiseValueError('badscore')中Python,变量名像xxx,以双下划线开头,以双下划线结尾,是可以直接访问的特殊变量,不是私有变量,所以不能使用name、score等变量名。Teacher看到以下划线开头的实例变量名称。比如_name,这样一个实例变量是可以被外部访问的,但是,按照惯例,当Teacher看到这样一个变量的时候。print(bart._Teacher__name)代码分析:双下划线开头的实例变量一定是外部访问不到的吗?其实并不是。无法直接访问该名称,因为Python解释器将名称变量更改为_Teacher_name。因此,仍然可以通过_Teacher_name访问__name变量。“虽然我可以被访问,但请把我当成一个私有变量,不要随意访问。”3.小结本文基于Python基础。引入对类内变量的访问限制。通过案例分析,给出了在实际应用中需要注意的点、遇到的问题以及有效的解决方案。欢迎大家积极尝试。有时候看别人实现很简单,但是到了自己实现的时候,总会出现各种各样的问题。不要野心太大,努力理解得更深刻。使用Python语言可以让读者更好的理解。代码很简单,希望对大家学习有所帮助。
