Discuss / Python / 请假一下私有的问题

请假一下私有的问题

Topic source

木杉_jy

#1 Created at ... [Delete] [Delete and Lock User]
class Person(object):
    def __init__(self,name,score):
        self.__name = name
        self.__score = score

    def get_name(self):
        return self.__name

    def get_score(self):
        return self.__score

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


class Student(Person):
    def get_grade(self):
        if self.score >= 90:
            return 'A'
        elif self.score >= 60:
            return 'B'
        else:
            return 'C'

bart = Student('bart',100)
bart.print_score()
bart.get_grade()

父类中 变量私有了,子类该如何调用啊? bart.get_grade() 报错 “'Student' object has no attribute 'score'”

木杉_jy

#2 Created at ... [Delete] [Delete and Lock User]
class Student(Person):

    def __init__(self,name,score):
        super(Student,self).__init__(name,score)

    def get_grade(self):
        if self.get_score() >= 90:
            return 'A'
        elif self.get_score() >= 60:
            return 'B'
        else:
            return 'C'

这样解决的

其他面向对象的语言中有Protect修饰符,是可以在本类或子类中访问到,也就是类似你的self.score这样去获取...但是,在python中,博主已经说明双下划线表示的是private,所以即使是子类也无法访问,即不能用self.score来访问...需要用get,set属性读写器来访问,即用你那个get_score()方法来读,设置的话也是用set_score()来写

既然你在父类中创建了get方法 那你为什么不在子类中去使用呢?

子类继承父类,需要调用父类构造方法,当然无参构造无需显式调用

super(Person,self).__init(name,score)

# 或
Person.__init__(name,score)

定义成__score 是外部不能轻易访问,内部还是可以改变它的值的


class Student(object):
    def __init__(self, name, score):
        self.__name = name   #访问保护,外面的就不能修改内部的对象
        self.__score = score

    def print_score(self):
        print("%s: %s" %(self.__name, self.__score))

    def change_score(self):
        self.__score = self.__score+10
        print(self.__score)

    #如果有外部想获取name和score就可以通过这种方法获取
    def get_name(self):
        return self.__name

    def get_score(self):
        return self.__score

    #如果有允许外部代码修改score,可以通过给Student类增加方法来实现
    def set_score(self, score):
        if 0<=score<=100:
            self.__score = score
        else:
            raise ValueError('Bad score')

bar = Student("Bart Simpson", 98)入代码

 bar.change_score()得到的就是108啊

曦冶程

#7 Created at ... [Delete] [Delete and Lock User]
在此插入代码

class Student(Person): def get_grade(self): if self.get_score() >= 90: return 'A' elif self.get_score() >= 60: return 'B' else: return 'C'

get_grade()方法改成这样就可以了,用父类中定义的get_score方法获取分数然后才能传进去

因为你get_score里面写成了score,而你之前写的都是__score


  • 1

Reply