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

对程序局部区域没有办法理解,求大神指导

class Student(object):

    def __init__(self, name, score,grade):#答案中为什么不用定义这个grade
        self.name = name
        self.__score = score
        self.__grade = grade

    @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>=80:这里为什么是self.score,既不能是score也不能是self.__score.很迷惑,求指导
            return 'A'
        elif score>=60:
            return 'B'
        return 'C'

s = Student('Bob', 59)
print (s.grade)

s.score = 60
print (s.grade)

s.score = 99
print (s.grade)


正在回答

3 回答

那个grade属性中的self.score相当于是调用了那个get方法,那个self.__score也是可以的!同样的道理

1 回复 有任何疑惑可以回复我~
#1

Codon

这才是正解!
2018-07-24 回复 有任何疑惑可以回复我~

【答案中为什么不用定义这个grade】        

        不能加在__init__中, __init__函数是初始化实例的作用,意思就是你创建s这个对象的时候(就是这个s = Student('Bob', 59))必须要赋值,既然要把grade加进去,那你创建s实例的时候也要给它赋值。就相当于传入了三个参数。

        题目给的意思是要给class类创建一个属性,而不是给实例创建属性。所以不能加在init函数中。@property这个装饰器可以将类里的一个方法(也就是平时的函数)变成类的属性,所以在这里就应该创建一个方法,然后用装饰器装饰成类的一个属性。

【这里为什么是self.score,既不能是score也不能是self.__score.很迷惑,求指导】

        你这句话是错的。这里必须是self.__score。在__init_函数中定义__score是表示这个是一个私有实例属性,外部不能直接调用。也就是说你这样定义一个类:

class Student(object):

    def __init__(self,  score):

        self.__score = score

在外部不能

s = Student( 59)

print (s.score)

这样会报错,s.__score也不行。__score的作用就是防止外部修改访问内部数据。

而这道题中为什么会定义 self.__score = score,是为了外部创建实例的时候可以用s.score。

它看上去是一个属性,其实是一个由@property修饰的类方法。

5 回复 有任何疑惑可以回复我~
#1

guyun

刚才理解你第二个问题。我说的这句“你这句话是错的。这里必须是self.__score。”不绝对。我看了廖老师的答案是用的self.score,我的答案是self.__score,都成功运行。这里的意思就是只的是init函数里的score变量。加下划线和不加下划线在内部是通用的。但是,在init函数中此处必须要用下划线。为了防止与类方法名冲突,即在外部实例调用score 的时候不知道是用的是自身变量还是用的是类的变量或是被装饰后的变量。
2017-09-03 回复 有任何疑惑可以回复我~
class Student(object):
 
    def __init__(self, name, score):#grade是一个被封装成类似于类中的“变量”的函数,本质还是
    #函数。只是调用形式很像访问字段(py我刚学不久,但是你可以相信我说的东西的正确性,只是不知道类中的
    #变量是不是称为字段,类似java和C#等高级语言中,把这种类中的变量称为“字段”,对“字段”的封装称为
    #“属性”,也是利用set和get存储器,这点在课程中有提到,python中也是类似的,)。一般习惯上把对某种
    #字段的封装得到的属性,命名使得名字类似,这样使得操作起来更直观,例如字段命名为a,那么属性命名为A
    #但是语法上,你也可以字段命名为a,但是属性命名为B,但是看起来不那么直观。。此处的代码就是把score字段
    #封装成了gender属性,所以你没看到gender字段的存在。定义的时候,把属性当做函数理解,调用的时候当做
    #用调用字段的方式调用函数就好了,还有问题请追加,我尽力解答
        self.name = name
        self.__score = score
        #self.__grade = grade
 
    @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 self.__score>=80:#这里应该是self.__score,不知道这是哪一题,所以无法测试,但是语法上讲,
        #应该是这个答案,其次,你用IDLE运行(我试过了),必须是这个答案,至于你说的情况,可能是答案
        #写错了,或者你看错了,或者慕课网的服务器出问题了
            return 'A'
        elif self.__score>=60:
            return 'B'
        return 'C'
 
s = Student('Bob', 59)
print (s.grade)
 
s.score = 60
print (s.grade)
 
s.score = 99
print (s.grade)


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255532    人
  • 解答问题       3038    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

对程序局部区域没有办法理解,求大神指导

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号