关于Python中的类与属性

这篇博客探讨了Python中如何隐藏类的内部属性,使用双下划线将属性变为私有,只允许内部访问。同时,通过getter和setter方法提供了对外部的访问接口。博主分享了学习廖雪峰老师教程后的笔记,并提醒尽管单下划线的变量可以被外部访问,但应被视为私有。最后,提出一个问题,涉及如何在类中增加一个类属性,以便在创建实例时自动统计学生人数,这与类的继承和多态有关。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                                                                                            根据廖雪峰老师的网站,学习过后的笔记

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

分析:

在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。而通过设置两个get_name(self)或者get_score(self)可以允许外部访问!

class Student(object):
    ...

    def get_name(self):
        return self.__name

    def get_score(self):
        return self.__score

通过set(name)函数可以修改name属性或者score属性的值,但一般不会这么干!

class Student(object):
    ...

    def set_score(self, score):
        self.__score = score

 有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。

最后,根据以上,完成问题的答案!

#创建Student类
class Student(object):
    #定义属性
    def __init__(self, name, gender):
        self.name = name
        self.__gender = gender
    #定义函数使得类外部可以调用gender值
    def get_gender(self):
        return self.__gender
    #定义函数使得类外部可以修改gender值,并设置gender值的有效性检查
    def set_gender(self,gender):
        if gender in ('female','male'):
          self.__gender=gender
        else:
           raise ValueError('invaild gender')

测试代码:

# 测试样例:
bart = Student('Bart', 'male')
if bart.get_gender() != 'male':
    print('测试失败!')
else:
    bart.set_gender('female')
    if bart.get_gender() != 'female':
        print('测试失败!')
    else:
        print('测试成功!')
 

另一问题:为了统计学生人数,可以给Student类增加一个类属性,每创建一个实例,该属性自动增加:(关于类-继承-多态的问题)

class Student(object):
    count = 0

    def __init__(self, name):
        self.name = name
        Student.count+=1
# 测试:
if Student.count != 0:
    print('测试失败!')
else:
    bart = Student('Bart')
    if Student.count != 1:
        print('测试失败!')
    else:
        lisa = Student('Bart')
        if Student.count != 2:
            print('测试失败!')
        else:
            print('Students:', Student.count)
            print('测试通过!')

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值