python|Python学习笔记(2)---B站黑马程序员

Python学习笔记(1)—B站黑马程序员
Python学习笔记(2)—B站黑马程序员
Python学习笔记(3)—B站黑马程序员

文章目录

  • Python进阶
  • 四、面向对象
    • 001-面向对象的基本概念
    • 002-类和对象
    • 003-面向对象基本语法
      • (1)类和对象的概念
      • (2)类和对象的关系
      • (3)类的设计
    • 004-面向对象基础语法
      • (1)dir 内置函数
      • (2)定义简单的类(只包含方法)
      • (3)方法中的 self 参数
      • (4)初始化方法
      • 如何给一个类设置属性?
      • (5)另外两个内置方法
    • 005-面向对象封装案例1
    • 006-面向对象封装案例2
      • is 和 is not
    • 007-私有属性和私有方法
      • (1)应用场景和定义方式
      • (2)伪私有属性和私有方法(科普)
    • 008-继承
      • (1)单继承
        • A.继承的概念、语法、特点
        • B.方法的重写
        • super
        • C.关于父类的私有属性和私有方法
      • (2)多继承
        • A.概念、语法
        • B.使用多继承的注意事项
        • C. Python中的MRO——方法搜索顺序
        • D.新式类与旧式(经典)类
    • 009-多态
      • (1)基本概念
      • (2)案例演练
    • 010-类属性和类方法
      • (1)类的结构
      • (2)类属性和实例属性
      • (3)类方法和静态方法
      • (4)方法综合案例
    • 011-单例
      • (1)单例设计模式
      • (2)__new__方法
      • (3)单例实现
      • (4)只执行一次依次初始化工作
    • 012-异常
      • (1)异常的概念
      • (2)捕获异常
        • A.简单的捕获异常语法
        • B.错误类型捕获
        • C.异常捕获完整语法
      • (3)异常的传递
      • (4)主动抛出异常
    • 013-模块和包
      • (1)模块
        • A.模块的概念
        • B.模块的两种导入方式
        • C.模块的搜索顺序[扩展]
        • D.原则——每一个模块都应该是可以被导入的
      • (2)包
      • (3)发布模块(知道)
        • A.制作发布压缩包步骤
        • B.安装模块
        • C.使用 pip 安装第三方模块
    • 014-文件
      • (1)文件的概念
      • (2)文件的基本操作
      • (3)针对文件/目录的常用管理操作
      • (4)文本文件的编码方式(科普)
    • 015-eval 函数

Python进阶 四、面向对象 001-面向对象的基本概念 python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片


002-类和对象 003-面向对象基本语法 (1)类和对象的概念
python|Python学习笔记(2)---B站黑马程序员
文章图片


(2)类和对象的关系
python|Python学习笔记(2)---B站黑马程序员
文章图片

(3)类的设计
python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

004-面向对象基础语法 (1)dir 内置函数
python|Python学习笔记(2)---B站黑马程序员
文章图片

(2)定义简单的类(只包含方法)
python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

使用 id() 函数,也可以得出对象的地址

python|Python学习笔记(2)---B站黑马程序员
文章图片

不是同一个对象

(3)方法中的 self 参数
python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

(4)初始化方法
python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

__init__方法第一个参数也必须是 self

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

如何给一个类设置属性?
在__init__(self,参数列表)方法中,设置属性: self.属性名 = 属性的初始值/形参 然后在创建对象时,使用 类名(属性...)调用class Cat: def __init__(self): self.name = "Tom" def eat(self): print("%s 爱吃鱼" % self.name)tom = Cat()或者class Cat: def __init__(self,name): self.name = name def eat(self): print("%s 爱吃鱼" % self.name)tom = Cat("Tom")

(5)另外两个内置方法
python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

005-面向对象封装案例1 python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

房间类可以和家具类写在一个文件里。 两个类可以写在一个文件里,也可以写在两个文件里(import导入就可以了)

python|Python学习笔记(2)---B站黑马程序员
文章图片

有些属性不需要从外部传入,就不用在__init__方法中设置形参。

python|Python学习笔记(2)---B站黑马程序员
文章图片

006-面向对象封装案例2 python|Python学习笔记(2)---B站黑马程序员
文章图片

一个类的属性可以是另一个类创建的对象

python|Python学习笔记(2)---B站黑马程序员
文章图片

两个类可以写在一个文件里,也可以写在两个文件里(import导入就可以了)

python|Python学习笔记(2)---B站黑马程序员
文章图片

初始化属性时,不知道设置什么初始值,可以设为None

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

is 和 is not
python 中针对 None 比较时,使用 is 判断 None 是一个 空对象

python|Python学习笔记(2)---B站黑马程序员
文章图片

007-私有属性和私有方法 (1)应用场景和定义方式
python|Python学习笔记(2)---B站黑马程序员
文章图片

私有属性和私有方法定义方式:在属性名或方法名前增加两个下划线。
python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

(2)伪私有属性和私有方法(科普)
python|Python学习笔记(2)---B站黑马程序员
文章图片

在Python中,没有真正意义上的私有: 在私有属性或私有方法前面加上 _类名,同样可以在外部访问到私有属性或私有方法。 但是不能这样做,这个仅供了解底层原理。

008-继承 python|Python学习笔记(2)---B站黑马程序员
文章图片

(1)单继承
A.继承的概念、语法、特点 python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

B.方法的重写 python|Python学习笔记(2)---B站黑马程序员
文章图片

python中好像没有重载
python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

覆盖父类的A方法: 在子类中,编写一个和A方法的方法名和参数列表都相同的方法,方法内容重写。

python|Python学习笔记(2)---B站黑马程序员
文章图片

对父类方法进行扩展: 子类中重写父类的方法,在子类的重写方法中,又使用了父类的某个方法, 可以使用super().父类方法,在子类重写方法中调用父类方法。

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

super python|Python学习笔记(2)---B站黑马程序员
文章图片

但是在python2.x的早期版本中,没有super,那么怎么调用父类方法? 用下面的方式:

python|Python学习笔记(2)---B站黑马程序员
文章图片

记得这种调用父类的方法,必须要加上第一个参数self
python|Python学习笔记(2)---B站黑马程序员
文章图片

如果在子类中,使用子类名.子类方法名(self),会形成递归调用,出现死循环,不能这样用。
C.关于父类的私有属性和私有方法 python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

在子类的方法中,可以调用父类的公有方法;
可以在父类的公有方法中调用父类的私有属性和私有方法;
那么在父类的公有方法中调用父类的私有属性和私有方法,然后在子类的方法中调用父类的公有方法,这样子类就可以间接访问父类的私有属性和私有方法。

python|Python学习笔记(2)---B站黑马程序员
文章图片

(2)多继承
A.概念、语法 python|Python学习笔记(2)---B站黑马程序员
文章图片

B.使用多继承的注意事项 python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

C. Python中的MRO——方法搜索顺序 python|Python学习笔记(2)---B站黑马程序员
文章图片

C类 查询某个方法 的 搜索顺序:
先在当前类 C类中 找; 没找到 去A类找;没找到去B类找;没找到 去object类找;再没找到,就报错。找到之后就不再往下找。

D.新式类与旧式(经典)类 python|Python学习笔记(2)---B站黑马程序员
文章图片

今后在定义类时,如果没有父类,建议统一继承自object
009-多态 (1)基本概念
python|Python学习笔记(2)---B站黑马程序员
文章图片

多态:不同的子类对象调用相同的父类方法
(2)案例演练
python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

010-类属性和类方法 (1)类的结构
python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

(2)类属性和实例属性
python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

类属性 相当于 Java中的静态变量
在类中 通过 赋值语句 定义类属性
通过 类名.属性名 调用类属性
实例属性,在__init__方法中使用 self.实例属名 定义;通过 对象.实例属性 调用。

python|Python学习笔记(2)---B站黑马程序员
文章图片

也可以通过 对象.类属性 调用类属性,但是不推荐这样使用。
使用 类名.类属性 访问 类属性。
使用 对象.类属性 = 值 赋值语句,只会给对象添加一个属性,而不会影响到类属性的值。

(3)类方法和静态方法
python|Python学习笔记(2)---B站黑马程序员
文章图片

类方法给类自己用,实例方法给实例用
调用类方法,不需要创建对象;使用 类名. 调用类方法,不要传递 cls 参数。
类方法 相当于 Java中的 静态方法
在类方法内部:使用 cls. 访问类属性;使用 cls. 访问其他的类方法;cls 是当前类。

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

静态方法,不需要必须设置第一个参数cls;通过 类名. 调用静态方法,不需要创建对象。
(4)方法综合案例
python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

011-单例 (1)单例设计模式
python|Python学习笔记(2)---B站黑马程序员
文章图片

单例:单个实例
(2)__new__方法
单例就是要做到 创建的所有对象的内存地址都是一样的,只有一个内存空间
为了实现单例,就要了解__new__方法 因为使用 类名() 创建对象时,Python解释器 会先调用__new__方法为对象分配内存空间 要实现 单例,就要重写 __new__方法

python|Python学习笔记(2)---B站黑马程序员
文章图片

重写__new__方法步骤(还没有实现单例):

python|Python学习笔记(2)---B站黑马程序员
文章图片

【python|Python学习笔记(2)---B站黑马程序员】__new__方法是静态方法,不能因为有参数cls,就认为是类方法;
静态方法也可以有形参;
__new__方法会返回对象的引用传递给__init__方法来初始化,但是重写的__new__方法无法返回对象的引用,可以使用父类object的__new__方法返回对象的引用;而父类object的__new__方法有一个形参cls,所以需要传递一个cls,即传递一个类,创建这个类的对象。

(3)单例实现
重写__new__方法实现单例:

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

(4)只执行一次依次初始化工作
创建一个对象,会执行两个操作:__new__和__init__ 例如 player =MusicPlayer() __new__方法会为对象创建对象创建内存空间,然后返回对象的引用,即返回给player 也会把引用返回给__init__方法作为参数,为对象初始化,定义对象的实例属性上面已经实现了 创建多个对象,但内存地址是一样的。但是每创建一个对象,就会执行一次__init__; 能否实现创建多个对象,只执行一次__init__初始化操作?

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

012-异常 (1)异常的概念
python|Python学习笔记(2)---B站黑马程序员
文章图片

(2)捕获异常
A.简单的捕获异常语法 python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

B.错误类型捕获 python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

程序执行时,可能会遇到不同类型的异常,并且需要针对不同类型的异常,做出不同的响应, 这是就需要捕获异常的错误类型。捕获错误类型语法: (1)可以在except后直接加上错误类型: except 错误类型1: # 针对错误类型1,执行相关代码 pass (2)如果有多种错误类型需要捕获,有两种写法: 写法一:多谢几个except: except 错误类型1: # 针对错误类型1,执行相关代码 pass except 错误类型2: # 针对错误类型2,执行相关代码 pass写法二:只写一个except: except (错误类型1, 错误类型2): # 针对错误类型1,2 执行相关代码 pass (3)那么如何知道错误类型是什么? 程序运行之后,如果发生错误会抛出异常,错误信息的最后一行的第一个单词就是 错误类型 (4)但是 并不可能预判出所有的错误类型,那么如何捕获未知错误? 语法:在try...except...代码块的最下面加上如下代码: except Exception as result: print("未知错误 %s" % result)Exception是python提供的异常类; result是一个变量名,可以随便起名字,可以通过result访问到异常信息

python|Python学习笔记(2)---B站黑马程序员
文章图片

C.异常捕获完整语法 python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

编写程序时,不一定写异常捕获的完整语法,有些可以不写。

python|Python学习笔记(2)---B站黑马程序员
文章图片

(3)异常的传递
python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

在一个py文件里,假设有两个函数+主程序,函数2内部调用函数1,主程序内部调用函数2; 两个函数都可能出现异常,但是如果对两个函数的异常都进行捕获,代码就会很多。 所以可以不对函数1和函数2的异常进行捕获,什么都不写,利用异常的传递性,在主程序对异常进行捕获就可以了。

(4)主动抛出异常
除了代码出现会抛出异常,也可以根据具体需求 主动抛出异常
python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

013-模块和包 (1)模块
A.模块的概念 python|Python学习笔记(2)---B站黑马程序员
文章图片

B.模块的两种导入方式 python|Python学习笔记(2)---B站黑马程序员
文章图片

如果想导入多个模块,可以使用 import 模块1, 模块2 这样的方式 但是 代码规范:导入模块时,每个导入应该独占一行,所以不要用上面这种写法。 用这种写法: import 模块1 import 模块2

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

大驼峰命名法:单词的首字母要大写,单词和单词之间不要用下划线

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

C.模块的搜索顺序[扩展] python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

D.原则——每一个模块都应该是可以被导入的
一个独立的python文件就是一个模块,导入模块是为了使用模块中的工具; 工具是:全局变量,函数,类; 但是导入的模块中不仅仅只有工具,还有例如:print(),会直接在被导入的模块中运行; 而这些是不希望被导入的,那么怎么做?使用__name__属性 __name__属性是python的一个内置属性 在当前程序下,__name__是一个字符串,该字符串是__main__ 即在当当前程序下 print(__name__) --->得到的是__main__字符串但是当该程序被别的文件导入时,在被导入的python文件中,__name__还是字符串, 但是字符串的内容不是__main__,变成了导入的模块的模块名。可以将模块将将不是工具的代码写在 if __name__ =="__main__" 语句下 这样在被导入的py文件中就不会执行这些代码在py程序中,一般会在最下方写一些测试代码, 但是这些测试代码并不希望在被导入包的程序中执行,这就用到了__name__一般会在当前程序下编写一个函数main(),该函数中是一些测试代码,if判断执行测试代码 def main(): passif __name__ == "__main__": main()

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

(2)包
python|Python学习笔记(2)---B站黑马程序员
文章图片

包:是包含多个模块的特殊目录,作用是:导入这个包,就可以导入包中的所有模块。 包中必须有一个__init__.py文件,指定对外界提供哪些模块。 该文件在创建包时会自动生成。 在一个py文件中,要导入包: import 包名调用包中的模块的工具: 包名.模块名.工具名

python|Python学习笔记(2)---B站黑马程序员
文章图片

(3)发布模块(知道)
python|Python学习笔记(2)---B站黑马程序员
文章图片

A.制作发布压缩包步骤
如果想将自己开发的模块分享给别人,可以按照如下步骤将模块压缩,将压缩后的压缩包分享给别人。 以下将 hm_message 包 压缩创建一个项目: 将包 hm_message复制到改项目下 然后再在该项目下创建一个 setup.py 文件 导入distutils模块中的setup函数, 该函数的参数是setup格式的字典,跟普通的字典不同,可以百度搜索以下。 重点在于py_modules 不能在pycharm中执行setup文件,需要在终端上执行。

python|Python学习笔记(2)---B站黑马程序员
文章图片

B.安装模块
如何使用别人分享的模块? 怎么将别人分享的模块压缩包安装在自己的python环境中? 在终端上

python|Python学习笔记(2)---B站黑马程序员
文章图片

如何找到安装目录? import hm_message hm_message.__file__得到模块/包的完整路径,该完整路径中就可以看到安装目录

C.使用 pip 安装第三方模块 python|Python学习笔记(2)---B站黑马程序员
文章图片

014-文件
怎么使用python访问保存在磁盘中的文件。

(1)文件的概念
python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

(2)文件的基本操作
python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

向文件中写入内容,使用write()方法,直接以字符串形式向write()方法传入参数即可

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

如果文件中有中文,需要加上encoding='utf-8' file = open("README", encoding='utf-8')

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

对于复制大文件,一次性读取完对内存负担太大,可以逐行读取。

(3)针对文件/目录的常用管理操作
对于文件/目录进行管理操作,而不是对它们的内容进行操作。首先要导入 os 模块

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

(4)文本文件的编码方式(科普)
python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

ASCII编码没有中文,python2.x使用ASCII编码,所以python2.x无法显示中文; UNICODE编码有中文,python3.x使用UNICODE编码,所以python3.x可以显示中文。

python|Python学习笔记(2)---B站黑马程序员
文章图片

虽然在 python2.x文件的第一行加上了,# *-* coding:utf8 *-* 但是如果字符串里有中文,还是无法读取字符串中的中文。 解决办法:在字符串的引号前,加一个小写字母 u

python|Python学习笔记(2)---B站黑马程序员
文章图片

015-eval 函数 python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

python|Python学习笔记(2)---B站黑马程序员
文章图片

eval(“…”)函数中可以写任何的终端命令,但不要滥用。

    推荐阅读