python面向过程
-
类和对象
- 类和对象的概念
- 类 是对一群具有相同 特征 或者 行为的事物的一个统称,是抽象的,不能直接使用
- 特征被称为属性
- 行为被称为方法
- 对象是由类创建出来的一个具体存在,可以直接使用
- 由哪一个类创建出来的对象,就拥有在哪一个类中定义的属性和方法
- 类 是对一群具有相同 特征 或者 行为的事物的一个统称,是抽象的,不能直接使用
- 类和对象的关系
- 类是模板,对象是根据 类这个模板创建出来的,应该现有类,再有对象
- 类只有一个,而对象可以有很多个
- 不同对象之间的属性可能会有不同
- 类中定义了什么属性和方法,对象中就有什么属性和方法,不可能多,也不可能少
- 类的设计
- 一个类通常满足以下三个要素:
- 类名:这类事物的名字,满足大驼峰命名法
- 属性:这类事物具有什么样的特征
- 方法:这类事物具有什么样的行为
- 类和对象的概念
-
面向对象基础语法
-
dir内置函数
- 在标识符/数据 后输入一个
.
,然后按下TAB
键,IPYTHON
会提示该对象能够调用的方法列表
- 使用内置函数
dir
传入标识符/数据,可以查看对象内的所有属性及方法
提示:__方法名__格式时python提供的内置方法/属性
序号 方法名 类型 作用 01 __ new __ 方法 创建对象时,会被自动调用,为对象分配空间 02 __ int__ 方法 对象被初始化时,会被自动调用 03 __ del __ 方法 对象被从内存中销毁前,会被自动调用 04 __ str __ 方法 返回对象的描述信息,print函数输出使用 - 在标识符/数据 后输入一个
-
定义简单的类(只包含方法)
class 类名: def 方法1(self,参数列表): pass def 方法2(self,参数列表): pass
-
创建对象
- 当一个类定义完成后,要使用这个类来创建对象,语法格式如下:
对象变量=类名()
-
-
方法中的self参数
- 在类的外部给对象增加属性
- 利用self在类封装的方法
- 由哪一个对象条用的方法,方法内的self就是哪一个对象的引用
- 在类封装的方法内部,self就表示当前调用方法的对象自己
- 在调用方法时,不需要传递self参数
- 在方法内部
- 也可以通过self,访问对象的属性
- 也可以通过self,调用其他的对象方法
- 由哪一个对象条用的方法,方法内的self就是哪一个对象的引用
-
初始化方法
-
之前的代码存在的问题—在类的外部给对象增加属性
- 在日常开发中,不推荐在类的外部给对象增加属性
- 如果在运行时,没有找到属性,程序会报错
- 对象应该包含由哪些属性,应该封装在类的内部
- 在日常开发中,不推荐在类的外部给对象增加属性
-
初始化方法
- 当使用类名()创建对象时,会自动执行以下操作:
- 为对象在内存中分配空间 — 创建对象
- 为对象的属性设置初始值 — 初始化方法(init)
- 这个初始化方法就是__init__方法,__init__是对象的内置方法
- __init __方法是专门用来定义一个类具有哪些属性的方法
- 当使用类名()创建对象时,会自动执行以下操作:
-
在初始化方法内部定义属性
- 在__init __方法内部使用self.属性名 = 属性的初始值就可以定义属性
- 定义属性后,再使用cat类创建的对象,都会拥有该属性
-
改造初始化方法—初始化的同时设置初始值
- 在开发过程中,如果希望在创建对象的同时,就设置对象的属性,可以对__init __方法进行改造
- 在方法内部使用self.属性 = 形参接收外部传递的参数
- 在创建对象时,使用类名(属性1,属性2…)调用
-
内置方法和属性
方法名 类型 作用 __ del __ 方法 对象被从内存中销毁前,会被自动调用 __str __ 方法 返回对象的描述信息,print函数输出使用
-
-
身份运算符
身份运算符用于比较两个对象内存地址是否一致 — 是否是对同一个对象的引用
- 在python中针对none比较时,建议使用is判断
运算符 描述 实例 is is是判断两个标识符是不是引用同一个对象 x is y,类似id(x)==id(y) is not is not是判断两个标识符是不是引用不同对象 x is not y,类似id(a) ≠id() is 与==区别:
is用于判断两个变量引用对象是否为同一个
==用于判断引用变量的值是否相等
-
私有属性和私有方法(在python中,并没有真正意义上的私有)
- 应用场景:在实际开发中,对象的某些属性或方法可能只希望在对象的内部被使用,而不希望在外部被访问到
- 定义方式:在定义属性或方法时,在属性名或者方法名前增加两个下划线,定义的就是私有属性或方法
-
继承
- 单继承
- 多继承
- 子类可以拥有多个父类,并且具有所有父类的属性和方法
- 如果父类之间存在同名的属性或方法,应该尽量避免使用多继承
继承语法
class 类名(父类名): pass
- 子类继承自父类,可以直接享受父类中已经封装好的方法,不需要再次开发
- 子类中应该根据职责,封装子类特有的属性和方法
c. 方法重写
- 应用场景:当父类的方法实现不能满足子类需求时,可以对方法进行重写(override)
- 重回父类方法有两种情况:
- 覆盖父类的方法
- 直接在子类中定义一个和父类同名的方法并且实现
- 对父亲方法进行扩展
- 在子类中重写父类的方法
- 在需要的位置使用super().父类方法来调用父类方法的执行
- 代码其他的位置针对子类的需求,编写子类特有的代码实现
- 覆盖父类的方法
-
类方法和静态方法
-
类方法
- 类属性就是针对类对象定义的属性
- 使用赋值语句在class关键字下方可以定义类属性
- 类属性用于记录与这个类相关的特征
- 类方法就是针对类对象定义的方法
- 在类方法内部可以直接访问类属性或者调用其他的类方法
@classmethod def 类方法(cls): pass
- 类方法需要修饰器
@classmethod
来标识,告诉解释器这是个类方法 - 类方法的第一个参数应该是
cls
- 由哪一个类调用的方法,方法内的cls就是哪一个类的引用
- 这个参数和实例方法的第一个参数是self类似
- 提示:使用其他名称也可以 ,不过这是习惯
- 通过类名.调用类方法,调用方法时,不需要传递cls参数
- 在方法内部
- 也可以通过cls,访问类的属性
- 也可以通过cls,调用其他的类的方法
b. 静态方法
使用条件:
- 既不需要访问实例属性或者调用实例方法
- 也不需要访问类属性或者调用类方法
@static method def 静态方法名(): pass
总结:
- 实列方法—方法内部需要访问实列属性
- 实列方法 内部可以使用类名.访问类属性
- 类方法 — 方法内部只需要访问类属性
- 静态方法—方法内部,不需要访问实列属性和类属性
- 类属性就是针对类对象定义的属性
-
单例
单例设计模式
- 设计模式
- 设计模式是前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对某一特定问题的成熟的解决方案
- 使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性
- 单例设计模式
- 目的—让类创建的对象,在系统中只有唯一的一个实例
- 每一次执行
类名()
返回的对象,内存地址是相同的
- 应用场景
- 音乐播放对象
- 回收站对象
- 打印机对象
__ new__方法
- 使用类名()创建对象时,python解释器首先会调用__new __方法为对象分配空间
- __new __是一个由object基类提供的内置的静态方法,主要作用有两个:
- 在内存中为对象分配空间
- 返回对象的引用
- python的解释器获得对象的引用后,将引用作为第一个参数,传递给__init __方法
重写__ new__方法的代码非常固定
- 重写__new 方法一定要return super().__ new__(cls)
- 否则python的解释器得不到分配了空间的对象引用,就不会调用对象的初始化方法
- 注意:__ new__是一个静态方法,在调用是需要主动传递cls参数
-
异常
-
捕获异常
-
简单的捕获异常语法
try: 尝试执行的代码 except: 出现错误的处理
-
错误类型捕获
try: #尝试执行的代码 except 错误类型1: #针对错误类型1,对应的代码处理 pass except (错误类型2,错误类型3): #针对错误类型2和3,对应的代码处理 pass except Exception as result: print("未知错误%s" %result )
- 当python解释器抛出异常时,最后一行错误信息的第一个单词,就是错误类型
-
完整语法
try: #尝试执行的代码 except 错误类型1: #针对错误类型1,对应的代码处理 pass except (错误类型2,错误类型3): #针对错误类型2和3,对应的代码处理 pass except Exception as result: print("未知错误%s" %resykt ) else: #没有异常会执行的代码 pass finally: #无论是否出现错误,都会执行的代码 pass
-
异常的传递
在开发中,可以在主函数中增加异常捕获,而在主函数中调用的其他函数,只要出现异常,都会传递到异常捕获中,这样就不需要在代码中,增加大量的异常捕获,能够保证代码的整洁
-
抛出raise异常
- 创建一个
exception
对象 - 使用
raise
关键字抛出异常对象
- 创建一个
python中每一个模块都有一个内置属性
__file__
可以查看模块的完整路径__ name__属性:可以做到只在测试情况下被运行,而在被导入时不会执行
if __name__ = "__main__":
-
-
-
包(package)
包是一个包含多个模块的特殊目录,目录下有一个特殊的文件 __ init__.py。包名的命名方式和变量名一致,小写字母+_
好处:使用import 包名 可以一次性导入包中所有模块
__ init__.py要在外界使用包中的模块,需要在__ init__.py中指定对外界提供的模块列表
#从当前目录导入模块列表 from . import send_message
-
制作发布压缩包步骤
-
创建setup.py
from distutils.core import setup setup(name=''#包名 version=''#版本 description=''#描述信息 long_description=''#完整描述信息 author=''#作者 author_email=''#作者邮箱 url=''#主页 py_modules=[])
-
构建模块
$ python3 setup.py build
c. 生成发布压缩包
$python3 setup.py sdist
d. 安装模块
c.卸载模块:直接从安装目录下,把安装模块的目录删除就可以
-
-
文件
-
文件的概念和作用
- 概念:就是存储在某种长期存储设备上的一段数据(硬盘、U盘、移动硬盘、光盘)
- 作用:将数据保存下来,在需要的时候使用
-
文件的存储方式:以二进制的方式保存在磁盘上
-
操作文件的函数/方法
函数 说明 open 打开文件,并且返回文件操作对象 read 将文件内容读取到内存 write 将指定内容写入文件 close 关闭文件 -
read方法—读取文件
#1.打开-文件名需要注意大小写 file = open('README') #2读取 text = file.read #3.关闭 file.close()
-
写入文件
访问方式 说明 r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。如果文件不存在,抛出异常 w 以只写方式打开文件。如果文件存在会被覆盖。如果文件不存在,创建新文件 a 以追加方式打开文件。如果该文件已存在,文件指针将会放在文件的结尾。如果文件不存在,创建新文件进行写入 r+ 以读写方式打开文件。文件的指针将会放在文件的开头。如果文件不存在,抛出异常 w+ 以读写方式打开文件。如果文件存在会被覆盖。如果文件不存在,创建新文件。 a+ 以读写方式打开问价。如果该文件已存在,文件指针将会放在文件的结尾。如果文件不存在,创建新文件进行写入。 #1.打开 file = open('README') #2.写入文件 file.write('hello') #3.关闭 file.close()
iii. 按行读取文件内容
readline方法:
- readline方法可以一次读取一行内容
- 方法执行后,会把文件指针移动到下一行,准备再次读取
iv. 文件/目录的常用管理操作
文件操作
方法名 说明 示例 rename 重命名文件 os.rename(源文件,目标文件名) remove 删除文件 os.remove(文件名) 目录操作
方法名 说明 示例 listdir 目录列表 os.listdir(目录名) mkdir 创建目录 os.mkdir(目录名) rmdir 删除目录 os.rmdir(目录名) getcwd 获取当前目录 os.getcwd() chdir 修改工作目录 os.chdir(目标目录) path.isdir 判断是否是文件 os.path.isdir(文件路径)
-
-
-
-
eval函数
eval函数十分强大—将字符串当成有效的表达式来求值并返回计算结果
#基本的数学计算
eval("1+1")
2
#字符串重复计算
eval('*'*10)
在开发时,千万不要使用eval直接转换input的结果