Python学习记录(六)——类

1.类

1.为什么引入类?

编程按照编程方法可分为面向过程的编程和面向对象的编程。

<1>面向过程的编程
面向过程是一种以过程为中心的编程方法。程序员从“过程”看问题、解决问题。
当处理的问题越来越复杂时,面向过程的编程方法具有以下缺点:
(1)数据变量代码重复;
(2)自定义函数变多产生新的管理和使用混乱;
(3)变量和函数的关联性不强。隐含着能否同时共享数据和函数的问题。

<2>面向对象的编程
面向对象是一种对现实世界理解和抽象的方法。把现实世界里的任何事物都当作一个相对独立的对象来看待。将现实世界的事物进行抽象,就出现了一种新的可以高效利用的数据类型——类。

,把具有相同特性(数据)和行为(函数)的对象,抽象为类。
类的特性通过数据来体现,类的行为通过函数来操作
通过类内的局部变量可以实现对数据的读写操作,函数可以实现对类的相关行为的操作。

例如,以盒子为例进行抽象
(1)归类,把所有大大小小的盒子都归为一类。
(2)提取实物特征,长、宽、高、颜色等。
(3)确定事物相关的操作行为,如统计、计算、修改等操作。

2.编写第一个类

Python学习记录(六)——类_第1张图片
class 类名(): (约定类名首字母大写)
‘’‘类文档说明’’'
类函数,在类或实例里又叫方法。本例中包含了__init__、volume两个函数。
注:volume为函数,volume()为方法。
④保留函数__init__()self关键字

【保留函数:不能用其他函数代替该函数的作用,包括函数名的写法,必须按照__init__()格式输入。】

def __init__(self)

实例也可以传递多个参数:

def __init__(self,length1,width1,height1)

__init__()函数的作用:(定义并初始化实例的属性)
(只供类<内部>使用的特殊保留函数,不对实例显示,不可被实例调用)
所有类都需要实例化,实例化是把类通过等号(=)赋值给一个变量的过程(如a=Box1(10,10,10))。这个变量a就是实例。实例的核心由属性和方法组成。必须先在类里声明__init__()函数,定义并初始化实例的属性,然后通过self传递。例如:self.length=length1,其中左边的length为实例属性,右边的length1为类的数据变量。实例化同时自动调用__init__()函数。
类里的函数要变为实例可以调用的方法也必须提供self参数。例如:

def volume(self):

其中,去掉self就不能被实例调用。

3.实例实现

Python学习记录(六)——类_第2张图片
其中,a=Box1(10,10,10)的赋值过程,就是实例化过程。实质是在内存中建立了类Box1的一个实例对象a。
同一个类也可以给多个实例对象赋值,那就是多实例,每个实例之间互不干扰,如实例对象a,b,c。

实例通过点号(.)调用属性、方法两个对象。
实例名.属性名
实例名.方法名

抽象的对象,比如盒子,核心为数据和函数。数据来体现特征,函数来操作行为;那具体是哪个盒子,就是一个实例。确定这个盒子的方法就是对实例的属性赋值,也就是实例化过程(实例可以传递参数,然后参数赋值给属性)。

2.属性

属性是通过__init__()函数定义,并通过self传递给实例的一种数据类型。

1.属性值初始化

(1)在__init__里直接初始化值
(2)传递参数初始化,在调用类时对类赋初值

2.属性值修改

(1)直接对属性值进行修改

c.width=10

(2)通过方法对属性值进行修改

def setNewWidth(self,width1):

self.width=width1

d=Box1() #创建新实例
d.setNewWidth(15) #通过setNewWidth()方法进行修改
print(d.width)
执行结果为:
15

3.把类赋给属性

当类的同一属性比较复杂时,可以考虑把与该属性相关的功能,通过另一个类来实现。

eg.上例中的类Box1具有颜色属性,但需要为颜色属性提供颜色设置和选择功能,比较复杂,因此用另外一个类来实现。
把颜色类 赋给颜色属性
Python学习记录(六)——类_第3张图片
Python学习记录(六)——类_第4张图片

3.类改造问题

1.继承(类)

当想对实例的属性和方法进行改造,却无法直接修改原始代码时,出现了新的技术方法——继承。
继承,在继承原有类功能的基础上,增加新的功能(属性或方法),形成新的子类。被继承的是父类。

继承基本格式:class 子类名(父类名):
可一个子类继承多个父类的功能:
class 子类名(父类名1,父亲名2,父亲名3,…):

eg.1 通过继承父类Bo1实现子类Box2
Python学习记录(六)——类_第5张图片
在这里插入图片描述
继承使用方法:
(1)在子类名声明时,引入父类名。如“class Box2(Box1):”
(2)重新定义子类的__init__函数。如果父__init__函数有参数,需要抄上。
(3)在子类__init__函数里写上super函数,实现父类和子类的关联,同步父类的参数(self除外)。
(4)子类中增加新的属性和方法定义。

继承可以多层级继承。

2.重写(方法)

可以在子类中重写父类的方法。
Python学习记录(六)——类_第6张图片在这里插入图片描述

4.私有

使类内的变量或函数只允许这个类自身访问,如__init__函数,本身用于类的初始化调用,没有被实例调用的必要。
使类定义的变量或函数变为私有,在名字前加上双下划线即可。
Python学习记录(六)——类_第7张图片
Python学习记录(六)——类_第8张图片
没有属性__say,也没有方法__p1().
在这里插入图片描述

5.把类放到模块中

与函数的调用和共享一样,当类需要被其他代码文件调用时,应该建立独立的类模块文件,实现类的独立存储并供他人调用。

建立独立类模块的过程与建立独立函数模块的过程相同。首先新建一个空白的模块文件;将自定义类的代码复制到该文件下;在主程序代码文件中导入自定义类,语法与导入函数的相同。之后便可使用自定义类。
Python学习记录(六)——类_第9张图片
执行结果为:在这里插入图片描述
其他几种类的导入方式,以及把类模块文件独立存放到指定路径的方法与之前函数的相同。见Python学习记录(五)——函数.

6.类回顾

1.静态类

可以创建实例的类叫作动态类,不支持创建实例的类为静态类。

静态类和动态类的关键区别:
(1)静态类内部没有self关键字,不能被实例化
(2)静态类不能通过类名传统参数。
(3)静态类不支持__init__()初始化函数。
(4)静态类不能被实例化,但它可以集成变量或函数,是一个带结构的数据类型。
Python学习记录(六)——类_第10张图片
如果实例化这个静态类,将报错!
Python学习记录(六)——类_第11张图片
<1>直接用类名调用静态类内部的变量和函数:
Python学习记录(六)——类_第12张图片
执行结果为:
Python学习记录(六)——类_第13张图片
注:不带return语句的函数,返回值默认为None。

利用静态类可以归类集成变量、函数的特点,可以把用途相关的变量或函数组织在一起,然后集成于模块,供其他代码通过类名直接调用。

<2>在调用处直接修改静态类变量值:
在这里插入图片描述
注:如果有3个主程序都在调用StaticC.name变量,一个地方的变量值改变,其他地方的值将同步改变

2.类与面向对象编程

面向对象编程的核心方法是封装、继承、多态

你可能感兴趣的:(Python,Python)