python3在线测试_Python3学习笔记16-访问限制

在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。

但是,从Student类的定义来看,外部代码还是可以自由地修改一个实例的name、score属性:

classStudent(object):

def__init__(self,name,score):

self.name = name

self.score = score

bart = Student('Bart Simpson',59)

bart.score = 99

print(bart.score)

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__

在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问

classStudent1(object):

def__init__(self,name,score):

self.__name= name

self.__score= score

defprint_socre(self):

print('%s:%s'%(self.__name,self.__score))

peter = Student1('Peter', 78)

print(peter.__name)

访问会报错

当外部代码想要获取ame和score,可以给Student类增加get_name和get_score这样的方法

classStudent2(object):

def__init__(self,name,score):

self.__name= name

self.__score= score

defprint_socre(self):

print('%s:%s'%(self.__name,self.__score))

defget_name(self):

returnself.__name

defget_score(self):

returnself.__score

kael = Student2('kael',99)

print(kael.get_name())

print(kael.get_score())

如果又要允许外部代码修改score怎么办?可以再给Student类增加set_score方法:

classStudent3(object):

def__init__(self,name,score):

self.__name= name

self.__score= score

defprint_socre(self):

print('%s:%s'%(self.__name,self.__score))

defget_name(self):

returnself.__name

defget_score(self):

returnself.__score

defset_score(self,score):

if0 < score <100:

self.__score= score

else:

returnValueError('bad score')

Anna = Student3('Anna',78)

print(Anna.get_score())

Anna.set_score(88)

print(Anna.get_score())

这样可以在set()方法中校验给出的数据是否是我们想要的,而不是随便传的

需要注意的是,在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量

练习

请把下面的Student对象的gender字段对外隐藏起来,用get_gender()和set_gender()代替,并检查参数有效性:

classStudent(object):

def__init__(self, name, gender):

self.name = name

self.gender = gender

classStudent4(object):

def__init__(self, name, gender):

self.name = name

self.__gender= gender

defget_gender(self):

returnself.__gender

defset_gender(self,gender):

self.__gender= gender

bart = Student4('Bart','male')

ifbart.get_gender() !='male':

print('测试失败!')

else:

bart.set_gender('female')

ifbart.get_gender() !='female':

print('测试失败!')

else:

print('测试成功!')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值