从封装看类的作用

1. 面向对象

面向对象是一种编程技术,也是一种编程思想,它最贴近人类的普通思维,但却在学习过程中难倒了很多初学者,很多人不明白它是什么,并质疑类存在的意义是什么,本篇文章,就带你从根源上理解类的存在意义。

小明和小红是同班同学,现在,需要你用python代码来存储他们两个人最基本的信息,姓名,和年龄,本文通过不同的形式来完成这一操作,从数据安全性的角度向你阐述类的作用。

2. 最普通的存储方式

# 小明的信息
name1 = '小明'
age1 = 14

# 小红的信息
name2 = '小红'
age2 = 14

我用了4行代码,存储了小明和小红的信息,但只要智商正常的人一眼就能看出代码中隐藏的问题,如果有10个学生信息需要存储,难道要写20行代码么?每个人的姓名都用一个变量来保存,从name1 到name10? 如果是1万个学生信息呢?编程中的问题,一旦数据量级发生变化,解决方案也要随之发生变化

3. 使用字典存储学生信息

xiaoming = {'name': '小明', 'age': 14}
xiaohong = {'name': '小红', 'age': 14}

这样写,是不是就清爽干净了许多,而且存储的数据也容易辨认, 但这样做也存在问题,虽然很隐蔽,但不可忽视。学生的信息是完全暴露的,可以在任意位置为修改

xiaoming['age'] = 15

这算是一个问题么?当然!!! 对于一个简单的只有50行的代码,你这样写或许是没问题的,但工作中的项目,都是需要多人合作的,你以为没有人会乱动你的数据,但你无法保证它不被修改,在未知情况下被人修改了数据,一旦出了问题,是很难追查的。面向对象三大特性之一的封装,其目的之一,就是为了避免数据随意被修改。

3. 使用类来存储表示学生信息

class Stu:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    def get_name(self):
        return self.__name

    def set_name(self, name):
        self.__name = name

    def get_age(self):
        return self.__age

    def set_age(self, age):
        self.__age = age

stu1 = Stu('小明', 14)
stu2 = Stu('小红', 14)

print(stu1.get_name(), stu1.get_age())
print(stu2.get_name(), stu2.get_age())

现在,如果想要修改age或者name属性,name必须通过set_age或者set_name方法,如果你想把age修改成一个不合理的数值,我就可以在set_age方法里进行检查来阻止你这种不合理的操作。通过使用类,可以将数据保护起来,不受意外操作的破坏,这只是面向对象编程技术众多好处中的一个。

python中,使用一个下划线就等于向使用者宣布这个属性是私有的,但你仍然可以直接对其修改,单个下划线更像是一种约定,而非技术上的强硬限制。即便使用了双下划线,也仍然有办法直接对其修改,但这已经不是类所要解决的问题了,一个人执意破坏数据,他总是能找到办法。

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案