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

关于@property的一些问题

# -*- coding: utf-8 -*-
class Student(object):
    def __init__(self, name, score):
        self.name = name
        #定义一个同名的实例属性
        self.score = score*1.0
        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):
        #打印self.score 结果是调用了get方法
        print self.score
        if self.score<60:
            return 'C'
        elif self.score<80:
            return 'B'
        else:
            return 'A'
            
    @grade.setter
    def grade(self,score):
        self
s = Student('Bob', 59)
print s.grade
s.score = 60
print s.grade
s.score = 99
print s.grade
1、实例属性score是不是就被覆盖了,使用s.score时候不能调用它了。有没有办法使用普通的实例属性
2、对于实例属性是不是不能用@property,我使用的时候会报错


正在回答

1 回答

你这个问题提的蛮不错的。暂时解决不了,但是有几点你可以参考一哈。

对于第一个问题:可以说成是覆盖,因为调出来的是装饰之后的属性,不是你定义的实例属性。也可以说成不是覆盖,换言之就是优先级。举个apple,子类继承父类,生成一个实例,然后调用实例的方法(方法也是属性)或是属性。如果子类“里边没有”,但是父类有,程序就会调用父类的结果出来。但是如果子类再继承父类之后,又重新定义了一个与父类名字一样的方法(方法也是属性)或是属性,那么调用的时候,就会直接调用子类里边的,就不会再去寻找父类的了。

参考代码:

class Person(object):
    def __init__(self,name,gender):
        self.name=name
        self.gender=gender

    def get_name(self):
        return self.name

class Student(Person):
    def __init__(self,name,gender,age):
        super(Student,self).__init__(name,gender)
        self.age=age

p = Student('Bob', 'male', 18)
print(p.get_name())
>>>
Bob

class Person(object):
    def __init__(self,name,gender):
        self.name=name
        self.gender=gender

    def get_name(self):
        return self.name

class Student(Person):
    def __init__(self,name,gender,age):
        super(Student,self).__init__(name,gender)
        self.age=age

    def get_name(self):
        return self.age

p=Student('Bob','male',18)
print(p.get_name())
>>>
18

对于第二个问题:你上边的代码就是对实例属性使用了property,结果就是调用self.score时返回的是实例属性self.__score的值(包装了self.__score,外壳是self.score,内容是self.__score)。

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

举报

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

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

进入课程

关于@property的一些问题

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

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

帮助反馈 APP下载

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

公众号

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