【010】Python全栈日记-类

在这里插入图片描述
本次以类为主,类是python作为面向对象编程的根本,内容非常重要,希望多读多理解,多查阅资料,推荐通过《Python编程:从入门到实践》来互补,书里面与我写的日记的引入方法不太一样,各有利弊。

这次的作业第三题很有意思,如果你充满想象力完全可以做成一个小时候玩的手机网页版q宠大乐斗。我做了一晚上,乐在其中(注定秃头)。

一、面相对象编程
面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。

1、面向对象 Object Oriented
面向对象的学习:
面向对象的语法(简单,记忆就可以搞定)
面向对象的思想(稍难,需要一定的理解)

2、面向对象和面向过程:
面向过程开发,以函数作为基本结构使用:
吃饭 -> 吃饭的函数
喝水 -> 喝水函数
洗衣服 -> 洗衣服的函数
看电影 -> 买票开电影函数

面向对象的开发,以对象作为基本结构使用
人:吃饭、睡觉、喝水 女朋友:洗衣服
吃饭 -> 调用人吃饭功能
喝水 -> 调用人喝水功能
洗衣服 -> 调用女朋友洗衣服功能

3、面向对象的优势
面向对象的开发非常适合大型程序开发,开发速度和后期维护都比过程化开发要好很多。同时,也会降低一点效率。
语言中对象结构的特色:高内聚,低耦合。

二、类和对象
面向对象编程的2个非常重要的概念:类和对象
1、什么是类
人类是一个类
动物类也是一个类
鸟类是一个类
女朋友也是一个类
汽车是一个类
狗也是一个类

类是一个实物的特征的集合也是行为和操作的概念的集合,是抽象的概念。

2、什么是对象
你的电脑就是一个对象
教室后边的空调就是一个对象
教室里的白板就是一个对象
你现在或者未来的女朋友就是一个对象

对象就是具体存在的看得见摸得着的某个实物。

3、类和对象的关系
类是多个对象归纳总结而来的,是一种概念。由对象总结出类的过程,叫做抽象化
对象是类的具体实现或者实施而来,他是真实的,特指某个事物。由类制作出对象的过程,叫做实例化
在这里插入图片描述
类中只有2种内容:成员属性和成员方法
[1]成员属性:
用于描述类的特征的变量就是成员属性
[2]成员方法:
用于描述类的功能的函数就是成员方法

(1) 定义类
类名最好用大写,小写没错,但是约定俗成大写!!!
在这里插入图片描述
驼峰命名法:类名:每个单词的首字母大写

(2)实例化对象
变量名 = 类名()在这里插入图片描述

(3)对象成员操作
例子:
在这里插入图片描述
操作:
[1]访问对象中成员
对象变量.成员属性名
对象变量.成员方法名()
在这里插入图片描述
[2]修改对象中成员
对象变量.成员属性名 = 值
对象变量.成员方法名 = 新值
在这里插入图片描述
[3]删除对象中成员
del 对象变量.成员属性名
del 对象变量名.成员方法名()
在这里插入图片描述
[4]添加对象中成员
对象变量.新成员属性名 = 值
对象变量.新成员方法名 = 值

(4)初始化方法
在这里插入图片描述
(看不懂这段话的,下面有我个人理解)init() 是一个特殊的方法,每当你根据People 类创建新实例时,Python都会自动运行它。 在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在避免Python默认方法与普通方法发生名称冲突。
我们将方法__init__() 定义成了包含三个形参: self 、 name 和age。在这个方法的定义中,形参self 必不可少,还必须位于其他形参的前面。 为何必须在方法定义中包含形参self 呢? 因为Python调用这个__init__() 方法来创建People实例时,将自动传入实参self。每个与类相关联的方法调用都自动传递实参self ,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。 我们创建People实例时,Python将调用Dog 类的方法__init__() 。我们将通过实参向People() 传递名字和年龄;self会自动传递,因此我们不需要传递它。每当我们根据People类创建实例时,都只需给最后两个形参(name和age) 提供值。
在这里插入图片描述
!!!我用人话说一遍,其实__init__()的意思就是,当你定义一个实例zs时(zs=People(‘张三’,18))会自动执行带有__init__的方法(def),而其他方法(def)需要手动去调用。
而self 就是传递给类的实例名字,在zs=People(‘张三’,18)中self就是zs,所以就是zs.name = name 而等号后面的name是‘张三’ 所以其实就是给zs实例赋值。

三、面向对象的三大特性
封装、继承和多态

1、封装
(1)什么是封装
在程序设计中,封装(Encapsulation)是对具体对象的一种抽象,即将某些部分隐藏起来,在程序外部看不到,其含义是其他程序无法调用。
要了解封装,离不开“私有化”,就是将类或者是函数中的某些属性限制在某个区域之内,外部无法访问。

(2)为什么要封装
封装数据的主要原因是:保护隐私

(3)私有化封装 private
私有化封装是最高级别的封装。私有化封装之后的成员,只能在类中/对象中访问,类的外部,子类中都不可以访问到。
在这里插入图片描述
在这里插入图片描述
私有化封装后的限制
类中/对象中 可以访问
类外/对象外 不可以访问
子类/子类对象 不可以访问

例如以下例子,age是私有封装后的属性,不能直接访问,但是可以通过内部的方法输出。
在这里插入图片描述
注意:在python中实现的封装操作,不是通过权限限制而是通过改名(name mangling 改名策略)实现的,名字变了找不到而已。
可以通过 对象名._类名__方法或类名._类名__方法名访问到(但禁止这么干)

(4)公共的封装 public
所有的成员默认都是公共的封装级别,可以在类中,类外,及子类中正常访问
在这里插入图片描述
公共封装后的限制
类中/对象中 可以访问
类外/对象外 可以访问
子类/子类对象 可以访问

2、继承
继承就是可以获取另外一个类中的成员属性和成员方法。(并非所有成员)
作用:继承的作用是增加代码的复用性,节省不必要的重复代码,提高开发效率,同时可以设置类之间的关系。

(1)继承的两个概念:
父类
用于被继承的类,称之为父类,也叫做基类,或者超类(super())
子类
继承其他类的类,称之为子类,也叫做派生类

(2)继承的格式
在这里插入图片描述

(3)一个完整的程序理解一下:
在这里插入图片描述
结果:
在这里插入图片描述
首先是People类的代码(见程序中#1)。
创建子类时,父类必须包含在当前文件中,且位于子类前面。 在#2处,我们定义了子类Student。定义子类时,必须在括号内指定父类的名称。方法__init__() 接受创建People实例所需的信息,并创建子类特有的属性(id,score)(见#3)。
#4处的super() 是一个特殊函数,帮助Python将父类和子类关联起来。这行代码让Python调用Student的父类的方法__init__() ,让Student实例包含父类的所有属性(name,age)。 父类也称为超类(superclass) ,名称super因此而得名。
为测试继承是否能够正确地发挥作用,我们尝试创建一个学生,但提供的信息与普通人时相同(name。age)再加上学生特有的学号(id)和成绩(score)。 在#5处,我们创建Student类的一个实例,并将其存储在变量zs 中。 这行代码调用Student类中定义的方法__init__() ,后者让Python调用父类People中定义的方法__init__()。我们提供了实参10086、‘zs’、18和89。

(4)继承的特征
1.所有类都是继承自object类
2.子类继承父类则可以访问父类的所有成员。(私有成员除外)
3.子类继承父类并不会将父类的所有成员复制到子类当中,而是间接通过父类来访问的,
4.子类可以具有自己独有的属性和方法
5.子类可以重载父类中的方法,只需要设置和父类指定成员相同的名称即可实现重载,重载之后的成员,子类只会访问当前类中的成员,而不会调用父类中同名的成员
6.子类中如果重载父类的方法,并且还想将重载的父类方法借调过来使用,可以在重载的方法中使用如下方法
super().方法()

3、多态
看一个代码然后我们再说多态:
在这里插入图片描述
结果:
在这里插入图片描述
这种调用相同方法say()的行为称为多态。也就是说,方法调用将作用在 x 的实际类型上。ls是Student类型,它实际上拥有自己的 say()方法以及从 Person继承的say()方法,但调用 ls.say()总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止。

这种子类定义和父类相同方法的行为,同样可以用于修改子类中父类的方法。
对于父类的方法,只要它不符合子类模拟的实物的行为,都可对其进行重写。为此,可在子类中定义一个这样的方法,即它与要重写的父类方法同名。这样,Python将不会考虑这个父类方法,而只关注你在子类中定义的相应方法。

四、方法的分类
1、实例方法/对象方法
只有实例化对象之后才可以使用的方法,该方法的第一个形参接收的一定是对象本身!
在这里插入图片描述

2、静态方法
无需实例化,可以通过类直接调用的方法,方法中的参数既不接收对象名也不接受类。 一般方法可以独立调用,跟类中其他成员关联不大
在这里插入图片描述

3、类方法
无需实例化,可以通过类直接调用的方法,但是方法的第一个参数接收的一定是类本身
在这里插入图片描述
示例
在这里插入图片描述
结果:
在这里插入图片描述

五、作业
在这里插入图片描述
最后一题为根据代码写出结果。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_39561473/article/details/85242292
今日推荐