编程按照编程方法可分为面向过程的编程和面向对象的编程。
<1>面向过程的编程
面向过程是一种以过程为中心的编程方法。程序员从“过程”看问题、解决问题。
当处理的问题越来越复杂时,面向过程的编程方法具有以下缺点:
(1)数据变量代码重复;
(2)自定义函数变多产生新的管理和使用混乱;
(3)变量和函数的关联性不强。隐含着能否同时共享数据和函数的问题。
<2>面向对象的编程
面向对象是一种对现实世界理解和抽象的方法。把现实世界里的任何事物都当作一个相对独立的对象来看待。将现实世界的事物进行抽象,就出现了一种新的可以高效利用的数据类型——类。
类,把具有相同特性(数据)和行为(函数)的对象,抽象为类。
类的特性通过数据来体现,类的行为通过函数来操作。
通过类内的局部变量可以实现对数据的读写操作,函数可以实现对类的相关行为的操作。
例如,以盒子为例进行抽象
(1)归类,把所有大大小小的盒子都归为一类。
(2)提取实物特征,长、宽、高、颜色等。
(3)确定事物相关的操作行为,如统计、计算、修改等操作。
①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就不能被实例调用。
其中,a=Box1(10,10,10)的赋值过程,就是实例化过程。实质是在内存中建立了类Box1的一个实例对象a。
同一个类也可以给多个实例对象赋值,那就是多实例,每个实例之间互不干扰,如实例对象a,b,c。
实例通过点号(.)调用属性、方法两个对象。
实例名.属性名
实例名.方法名
类是抽象的对象,比如盒子,核心为数据和函数。数据来体现特征,函数来操作行为;那具体是哪个盒子,就是一个实例。确定这个盒子的方法就是对实例的属性赋值,也就是实例化过程(实例可以传递参数,然后参数赋值给属性)。
属性是通过__init__()函数定义,并通过self传递给实例的一种数据类型。
(1)在__init__里直接初始化值
(2)传递参数初始化,在调用类时对类赋初值
(1)直接对属性值进行修改
c.width=10
(2)通过方法对属性值进行修改
def setNewWidth(self,width1):
self.width=width1
d=Box1() #创建新实例
d.setNewWidth(15) #通过setNewWidth()方法进行修改
print(d.width)
执行结果为:
15
当类的同一属性比较复杂时,可以考虑把与该属性相关的功能,通过另一个类来实现。
eg.上例中的类Box1具有颜色属性,但需要为颜色属性提供颜色设置和选择功能,比较复杂,因此用另外一个类来实现。
把颜色类 赋给颜色属性:
当想对实例的属性和方法进行改造,却无法直接修改原始代码时,出现了新的技术方法——继承。
继承,在继承原有类功能的基础上,增加新的功能(属性或方法),形成新的子类。被继承的是父类。
继承基本格式:class 子类名(父类名):
可一个子类继承多个父类的功能:
class 子类名(父类名1,父亲名2,父亲名3,…):
eg.1 通过继承父类Bo1实现子类Box2
继承使用方法:
(1)在子类名声明时,引入父类名。如“class Box2(Box1):”
(2)重新定义子类的__init__函数。如果父__init__函数有参数,需要抄上。
(3)在子类__init__函数里写上super函数,实现父类和子类的关联,同步父类的参数(self除外)。
(4)子类中增加新的属性和方法定义。
继承可以多层级继承。
使类内的变量或函数只允许这个类自身访问,如__init__函数,本身用于类的初始化调用,没有被实例调用的必要。
使类定义的变量或函数变为私有,在名字前加上双下划线即可。
没有属性__say,也没有方法__p1().
与函数的调用和共享一样,当类需要被其他代码文件调用时,应该建立独立的类模块文件,实现类的独立存储并供他人调用。
建立独立类模块的过程与建立独立函数模块的过程相同。首先新建一个空白的模块文件;将自定义类的代码复制到该文件下;在主程序代码文件中导入自定义类,语法与导入函数的相同。之后便可使用自定义类。
执行结果为:
其他几种类的导入方式,以及把类模块文件独立存放到指定路径的方法与之前函数的相同。见Python学习记录(五)——函数.
可以创建实例的类叫作动态类,不支持创建实例的类为静态类。
静态类和动态类的关键区别:
(1)静态类内部没有self关键字,不能被实例化。
(2)静态类不能通过类名传统参数。
(3)静态类不支持__init__()初始化函数。
(4)静态类不能被实例化,但它可以集成变量或函数,是一个带结构的数据类型。
如果实例化这个静态类,将报错!
<1>直接用类名调用静态类内部的变量和函数:
执行结果为:
注:不带return语句的函数,返回值默认为None。
利用静态类可以归类集成变量、函数的特点,可以把用途相关的变量或函数组织在一起,然后集成于模块,供其他代码通过类名直接调用。
<2>在调用处直接修改静态类变量值:
注:如果有3个主程序都在调用StaticC.name变量,一个地方的变量值改变,其他地方的值将同步改变。
面向对象编程的核心方法是封装、继承、多态。