为了账号安全,请及时绑定邮箱和手机立即绑定

大神你在哪里?快来救救我!!!

大神你在哪里?快来救救我!!!

asdhjhg 2017-03-15 14:32:47
class Teacher(object):     def __init__(self, name,score):         self.name = name         self.__score = score w=Teacher('ab',22) print w._Teacher__score      #对于私有属性这样为什么就可以访问啊?还有一个问题class Student(object):     def __init__(self, name, score):         self.name = name         self.__score = score     @property     def score(self):         return self.__score     @score.setter     def score(self, score):         if score < 0 or score > 100:             raise ValueError('invalid score')         self.__score = score     @property     def grade(self):         if score>=90:             return 'A'         elif score>=60:             return 'B'         return 'C' s = Student('Bob', 59) s.__score(1000) print s.__score#这里可以正常打印1000,为什么? s.score=1000 print s.score#这里就会报错?又是为什么?
查看完整描述

1 回答

?
asd8532

TA贡献143条经验 获得超187个赞

双下划线开头其实只是一种让程序员遵守的命名规范。其中的w._Teacher__score 是python里私有变量轧压(Private name mangling)技术,可以访问私有变量,有人说是一种灵活的技巧,认识就可以了

def prin(self):
        print self.__score#定义一个输出__score的函数
 
s = Student('Bob', 59)
s.__score=1000
print s.__score#我们以为已经修改了__score但事实上并没有,这个__score和我们的self.__score不是同一个
s.prin()

#输出结果是,而不是2个1000
##59


查看完整回答
1 反对 回复 2017-03-15
  • 1 回答
  • 0 关注
  • 1195 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信