其实许多知识点,我们看似已经熟悉还不能再熟悉,而且有些代码已经成为习惯,因为我们对他们太熟悉了,而忘记问一句为什么会这样写,所以适当抽出时间对一些过往的或者熟悉知识进行整理,可能会有意想不到的收获
Python 语言对面向对象的支持
当初 OOP 这种设计模式有多火,就连销售经理在跟客户谈时候,是不是都会用一两次这个术语—面向对象。不过这两年其势头有点被 FP(函数式编程)盖过,不过大多数情况下我还是会选择面向对象方式进行建模和组织代码,那么什么是面向对象编程
什么是面向对象编程
面向对象的编程是一种编程范式,提供了一种结构化程序的方法,将属性和行为绑定到单个对象中。换句话说,面向对象编程是一种对具体的、现实世界的事物进行建模的方法,如汽车,以及事物之间的关系,如公司和雇员、学生和教师,等等。
面向对象的编程是一种编程范式,提供了一种结构化程序的方法,将属性和行为绑定到单个对象中。也就是定义数据结构,数据结构反应一个事物,例如商品是集合名称,是抽象的对商品描述,具有一般性。而具体一个商品是一个实例,具有商品的名称、规格和售价等属性。还有电子邮件,其属性包括收件人列表、主题和正文,以及添加附件和发送等行为。
可能大家对 OOP 认识会有点偏差,就是 OOP 不仅是对现实事物进行建模的方法,设计程序时将真实事物对应到面向对象一个类,面向对象中类是一种数据结构,面向对象 OOP 目标是有效合理地去组织代码。是我们如何实现多人开发有效组织代码的解决方案,这是到今天为止我对面向对象一点认识。
什么是过程式编程
OOP 将现实世界的实体建模为软件对象,这些对象有一些与之相关的数据以及行为以对象形式组织在一起。另一种常见的编程范式是过程化编程,像根据食谱来烹饪一个美味的菜肴一样来设计程序,按照做事流程来组织代码完成一项任务。
关键的启示是,对象是 Python 中面向对象编程的中心,不仅像程序式编程那样代表数据,而且在程序的整体结构中也是如此。
在 python 定义类
基本数据结构,如 numbers
、string
和 list
设计这些基本类型用来表示简单的信息,例如一套课程的,水果或最喜欢的颜色,这样用基本数据类型是无法表示,我们需要更复杂数据类型来描述这些事物。
例如,需要维护一个发布的课程列表。需要存储每套课程的的一些基本信息,如课程标题、难度级别、课程数。
basic_machine_learning_tut = ["basic machine learning",'baisc',12]
basic_python_tut = ["basic python",'baisc',12]
deep_learning_tut = ["basic python",'advance',6]
这种表示方式存在着一些问题
- 难于管理和维护,当使用引用
basic_machine_learning_tut[0]
我们需要熟悉在列表索引为 0 值对应是课程哪一个属性,是课程名称还是课程数
- 难于维护,一旦某一条记录有数据遗漏就会发生数据错位,随着带来获取数据不正确。
用类(class)维护数据好处,就是可读性和易于维护
类和实例
类是用来创建用户定义的数据结构。在类中定义的函数称为方法,方法用于如何基于类来创建一个对象,可以用于操作数据,例如定义如何获取数据,如何更新数据。接下来围绕课程这个类,来分享如何定义一个类以及使用一个类。类是抽象对事物描述,是对一类事物的抽象,例如学生、职员和公司,我们根据业务对这些事物进行抽象,给出一个描述,有点类似生成零件设计图纸,其中并不包含任何实际数据,当然也会包含一些对象间共享方法和数据。
有了图纸,我们就可以根据图纸来定义一个实例(对象),对象相对于类是一个具体的数据结构。
在 Python 如何定义一个类
class Tut:
pass
在 python 中定义类,使用 class 关键字后面给类名称,类作为一个集合通常是首字母大写具有实际意义的名称,可以用驼峰式命名来为类进行命名, pass 通常被用作占位符,避免在方法或函数体中没有实现而抛出一个错误。
所有课程对象必须具备的一些属性可以放一个叫做.__init__()
的方法中定义,可以将方法理解类构造函数。每次创建一个新的课程对象时,在初始化.__init__()
通过分配对象的属性值来初始化对象的属性。也就是说,.__init__()
初始化了该类的实例。__init__()
的第一个参数总是 self
然后随后是其他参数。