您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息
三六零分类信息网 > 河源分类信息网,免费分类信息发布

面向对象特性之一:封装(Python进阶教程)

2023/12/1 17:29:12发布30次查看
前面的文章我们介绍了面向对象的程序设计比较基础的部分(参考昨天的文章《面向对象的程序设计思想(python进阶教程)》),今天我们将向大家介绍面向对象的特性之一:封装。我们还是以前次“快递公司老板管理员工”这个例子来举例说明什么是封装,封装的特点以及怎样进行封装;
概述
你还是一个快递公司的老板,手下有二十个员工,你要求他们每人每天要送100个包裹,你需要亲自开着车带他们去送吗?不需要;你需要告诉他们应该选择什么样的交通工具,走什么样的路线吗?不需要;你只需要发个命令,让张三送这100件,李四送那100件。不需要关心他们是怎么送的,只需要知道结果:完成还是未完成,就可以了,这样的方式就叫做封装;
封装的好处是显而易见的,它可以把复杂的逻辑和数据封装起来,外面指挥的人(对象的调用)不需要知道内部到底做了什么逻辑,只关心结果就可以了。现在我们回到代码上来:
我们在之前定义了一个员工的类,它具有姓名、年龄等属性,也有送货这种方法,现在我们修改一下,增加一个工资的私有属性,增加三个送货过程的私有方法,代码如下:
私有方法和私有变量属性在这个例子中,引入了一个概念:私有,在python里,是靠下划线来区分一个函数或属性是什么类型的。
方法的几种类型
__foo__:特殊方法,一般为系统定义的名字,如我们之前接触的构造、析构函数;(双下划线开头,双下划线结尾)_foo:保护方法/属性,这里我们先跳过,到类的继承章节处再讲;(单下划线开头)__foo:私有方法/属性,只允许类的内部访问,在类外面无法访问;(双下划线开头)foo:公有方法/属性,类的外部和内部都能访问;(无下划线)
封装的意义就在于:将不需要外面调用的方法设置为私有方法,封装好逻辑操作,在调用类的方法时,只需调用公有方法即可。例如上例,让员工送包裹,只要调用方法“sendpackage()”,至于员工怎么送,先装货(__loadingpackage),再开车(__bycar),最后卸货(__unloadingpackage),这些步骤外面调用并不关心。
封装的意义:
明确的区分内部、外部逻辑;将复杂逻辑隔离;扩展性强。如需要改变步骤,先开车,再换自行车,则只需增加一个私有方法(__bybike),外部还是原方法调用即可,示例如下;
增加一个私有方法,调用不变对外部的传入数据进行严格的限制,以确保在类里的逻辑部分不会出错,例如上面的例子可以是这样:
方法里严格控制传入的数据
@property、@setter和@deleter
介绍类的封装的知识,就不得不提到@property、@setter和@deleter,它们是python里的几个内置装饰器。它们的好处是显而易见的,下面我们来学习一下。
通过上面的知识我们了解到,把一个类里的属性设置成为私有变量,好处是外面不能随意修改参数了,但是,在类里面也不能从外面获取数据了,怎么办呢?在c++里通常的做法是用两个函数:
get_value()和set_value()
python也能这么写,如下图所示(为了单独将这个单元的知识,简化了代码):
但是,这就体现不出来python的优势了,不是吗?我们可以将上面的代码简化一下,这样写:
亮点在于使用了“property”将方法转变为属性,让外部调用的时候认为是一个属性来传递值,实际上通过set_salary()方法设置参数;
重点来了,python还有更简单的写法,如下图:
只需要通过emp1.salary就能做到修改,查看和删除数据,在类的内部通过@property、@setter和@deleter这三个 装饰器 来实现。可以将其理解为@property是只可读取,@setter是可读取可修改,@deleter是可读取可修改可删除;
合理的使用@property、@setter和@deleter的功能,可以使代码结构清晰,调用方便,维护数据也更加方便;
河源分类信息网,免费分类信息发布

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录