Python面向对象--笔记

一、类的创建

self的含义 --> 当前对象
cls的含义 --> 当前类
在这里插入图片描述

构造函数:在数据库连接时触发

_ _ init _ _(self):

析构函数:在数据库关闭 / 文件保存时触发

_ _ del _ _(self):

类的组成

类属性

通过对象修改类属性时,只是动态地给当前对象添加了一个属性,并不能改变类属性

class Fish:
    name = "鱼类"
    def __init__(self,weight):
        self.weight = weight
    def swim(self):
        print("鱼会游")
jinyu = Fish(123)
liyu = Fish(235)
Fish.name = "鲨鱼"
jinyu.name = "金鱼"
print(Fish.name)    # 鲨鱼
print(jinyu.name)   # 金鱼
print(liyu.name)    # 鲨鱼

实例方法

静态方法
在这里插入图片描述

类方法
在这里插入图片描述
在这里插入图片描述

例:定义一个类

   class Student:
        #类属性
        native_place = '北京'    #直接写在类中的变量-->类属性
    
        #初始化方法
        def __init__(self,name,age):
            self.name = name    #self.name是实体(对象)属性,这里将局部变量name的值赋给实体属性
            self.age = age
    
        #实例方法(类之外定义的-->函数,类之内定义的-->方法)
        def eat(self):
            print('学生在吃饭...')
    
        #静态方法
        @staticmethod
        def method1():      #括号内不允许写self
            print("使用了staticmethod,这是一个静态方法")
    
        #类方法
        @classmethod
        def cm(cls):   # cls表示当前类
            print("这是一个类方法!")

类方法、静态方法可以使用类名直接访问

动态绑定

可以在创建对象后动态绑定属性,方法

先创建一个类

   class Student:
        native_place = '北京'
    
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
        def eat(self):
            print(self.name + "在吃饭!")
    
    stu1 = Student('张三',20)
    stu2 = Student('李四',22)

动态绑定属性

stu1.gender = '女'
print(stu1.name,stu1.age,stu1.gender)

动态绑定方法

def show():
    print("这是一个定义在类外部的方法!")

stu1.show = show
stu1.show()

二、面向对象三大特征

封装

提高程序安全性

不希望某属性在类对象外部被访问,前边使用’_ _’
在这里插入图片描述

在这里插入图片描述

def __init__(self,name,age):
    self.__name = name	# 私有属性 不希望name在外部被访问
    self.age = age

print(stu._Student__name)	#但仍可以通过这种方式访问,但不建议访问

继承

提高代码的复用性

如果一个类没有继承任何类,则默认继承object类

例:父类:

class Animal:
    def __init__(self,name,sex):
        self.name = name
        self.sex = sex

    def say(self):
        print("说话的方法")

子类继承父类

①继承父类的构造方法

   父类.__init__(self,父类构造函数的参数列表)
class Dog(Animal):
    # 方法一:继承父类的构造方法
    def __init__(self,name,sex,weight):
        Animal.__init__(self,name,sex)
        self.weight = weight
        
    def eat(self):
        print("吃饭的方法")

②super

super(子类,self).__init__(父类构造函数的参数列表)
class Dog(Animal):
    # 方法二:隐式继承父类的构造函数
    def __init__(self,name,sex,weight):
        super(Dog,self).__init__(name,sex)
        self.weight = weight

    def eat(self):
        print("吃饭的方法")

python支持多继承

class A(object):
    pass
class B(object):
    pass
class C(A,B):   #同时继承A和B
    pass
class Father:
    def __init__(self,surname):
        self.surname = surname

    def sing(self):
        print("唱歌")

class Mother:
    def __init__(self,height):
        self.height = height

    def draw(self):
        print("画画")

class Son(Father,Mother):
    def __init__(self,surname,height,age):
        Father.__init__(self,surname)
        Mother.__init__(self,height)
        self.age = age

    def study(self):
        print("学习")

zhangsan = Son("zhangsan",178,20)

定义子类时,必须在其构造函数中调用父类的构造函数

super().__init__(name,age)

方法重写

def info(self):
    super().info()		#通过super().xxx()调用父类中被重写的方法
    print(self.stu_no)

Object类(所有类的父类)

def __str__(self):			#重写__str__()方法
    return '我是{0},今年{1}岁!'.format(self.name,self.age)	
    
stu = Student('张三',22)
print(stu)		#我是张三,今年22岁!  自动调用__str__()方法

内置函数dir()可以查看指定对象的所有属性

多态

提高程序的可扩展性和可维护性

静态语言(Java)和动态语言(Python)关于多态的区别

静态语言实现多态的必要条件:

	继承

	方法重写

	父类引用指向子类对象

动态语言:只关心行为(方法)

eat() 在不同的子类中被重写了,属于多态

class Animal:
    def eat(self):
        print("动物从吃东西")

class Fish(Animal):
    def eat(self):
        print("鱼吃虾米")

class Dog(Animal):
    def eat(self):
        print("狗吃骨头")

特殊方法和特殊属性

特殊属性
__dict__        获得类对象或实例对象所绑定的所有属性和方法的字典
__class__		输出实例对象所属的类
__bases__		输出类对象的父类元素
__base__		输出最近的父类
__mro__			输出所继承的类的层次结构(最后是object)

特殊方法
__len__()       重写__len__()方法,让内置函数len()的参数可以是自定义类型
__add__()       重写__add__()方法,可使自定义对象具有“+”功能
__new__()       用于创建对象
__init__()      对创建的对象进行初始化 
__subclasses__()输出子类列表

三、类的浅拷贝和深拷贝

变量的赋值操作

cpu1 = CPU()
cpu2 = cpu1
print(cpu1)	#<__main__.CPU object at 0x000002E82B3E85E0>
print(cpu2)	#<__main__.CPU object at 0x000002E82B3E85E0>

浅拷贝

Python拷贝一般都是浅拷贝

实例对象(如下面的computer和computer2)不一致,但子对象一致(如下面的cpu和disk)

  computer = Computer(cpu1,disk)
    import copy
    computer2 = copy.copy(computer)
    
    #	<__main__.Computer object at 0x00000147C272F6D0> <__main__.CPU object at 0x00000147C27585E0> <__main__.Disk object at 0x00000147C2758C10>
    print(computer,computer.cpu,computer.disk)
    
    #	<__main__.Computer object at 0x00000147C276EBB0> <__main__.CPU object at 0x00000147C27585E0> <__main__.Disk object at 0x00000147C2758C10>
    
    print(computer2,computer2.cpu,computer2.disk)

深拷贝

采用copy模块的deepcopy()函数,递归拷贝对象中包含的子对象,源对象和拷贝对象所有的子对象不同

  computer3 = copy.deepcopy(computer)
    
    #	<__main__.Computer object at 0x000002588018F6D0> <__main__.CPU object at 0x00000258801B85E0> <__main__.Disk object at 0x00000258801B8C10>
    
    print(computer,computer.cpu,computer.disk)
    
    #	<__main__.Computer object at 0x0000025880256430> <__main__.CPU object at 0x0000025880256370> <__main__.Disk object at 0x000002588028E4C0>
    
    print(computer3,computer3.cpu,computer3.disk)

四、模块和包

模块的简单介绍

模块的英文:Modules

一个模块中可以包含:多个函数、多个类(类属性、类方法…)、多条语句

一个.py文件就是一个模块

在这里插入图片描述

自定义模块

"""
自定义模块:创建模块-->导入模块

①创建模块:
新建一个.py文件,名称尽量不要与Python自带的标准模块名称相同

②导入模块
import 模块 [as 别名]
from 模块 import 函数/变量/方法的名称 [as 别名]
"""

eg:

calc.py文件:

def add(a,b):
    return a + b
def div(a,b):
    return a / b

另一个文件:

import calc
print(calc.add(2,3))

以主程序方式运行

calc2.py文件

def add(a,b):
    return a + b

#只有当点击运行calc2时,才会执行运算(将该.py文件导入其他文件中运行时,这一句不会运行)
if __name__ == '__main__':  
    print(add(10, 20))

Python中的包

包和目录的区别

包:包含__init__.py文件
目录:不包含__init__.py文件

导入包中的模块:import 包名.模块名

import  package1.module_A
print(package1.module_A.a)

或者可以用别名(更方便)

import  package1.module_A as a
print(a.a)

注意:

①使用import 只能导入包名或模块名

②使用from…import 可以导入包、模块名、函数名、变量名

Python中常用的内置模块

1、sys

与python解释器及其环境操作相关的标准库

2、datetime 和time

提供与时间相关的各种函数的标准库

datetime

import datetime
print(datetime.date(2022,7,8))  # 2022-07-08
print(datetime.time(10,47,22))  # 10:47:22
print(datetime.datetime.now())  # 2022-07-08 10:47:28.481812
print(datetime.datetime.now() + datetime.timedelta(5))  # 2022-07-13 10:48:28.245302

time

import time
print(time.time())  # 1970年1月1日0时0分0秒 至今的秒数
print(time.strftime("%Y-%m-%d %H:%M:%S"))   # 2022-07-08 10:54:11
time.sleep(5)   # 程序休眠5秒

3、os

提供了访问操作系统功能的标准库

import os

curdir 表示当前目录

print(os.curdir)        # .

getcwd() 表示当前路径(当前文件所在目录)

print(os.getcwd())      # E:\newStudy\python_workspace\chap17

mkdir(“新建文件夹名”) 在该路径下创建文件夹,不能创建已经存在的文件夹,引号内为新建的文件夹名

os.mkdir("new_dir")

rmdir() 只能删除空文件夹

os.rmdir("./new_dir")

rename 重命名文件

os.rename("test.py","demo.py")

remove 删除文件

os.remove("demo.py")

os.path.join() 拼接路径

print(os.path.join("E:\\newStudy\\python_workspace\\chap17","demo5.py"))   # E:\newStudy\python_workspace\chap17\demo5.py

os.path.getsize(“文件名”) 获取文件的大小

print(os.path.getsize("demo4.py"))

os.path.isfile() 判断是否是文件

print(os.path.isfile("demo4.py"))   # True

os.path.isdir() 判断是否是文件夹

print(os.path.isdir("demo4.py"))    # False

os.path.exists() 判断文件或文件夹是否存在

print(os.path.exists("demo4.py"))   # True
print(os.path.exists("demo6.py"))   # False

4、calendar

提供与日期相关的各种函数的标准库

5、urllib

用于读取来自网上(服务器)的数据标准库

6、json

用于使用JSON序列和反序列化对象

7、re

用于在字符串中执行正则表达式匹配和替换

8、math

提供标准算数运算函数的标准库
在这里插入图片描述

9、decimal

用于进行精确控制运算精度、有效数位和四舍五入操作的十进制运算

10、logging

提供了灵活的记录事件、错误、警告和调试信息等日志信息的功能

11、random

生成随机数或者从列表中随机获取数据
在这里插入图片描述

第三方模块的安装

在线安装方式,可以在Pycharm的Terminal中安装

pip install 模块名

eg: pip install schedule

第三方模块的使用

import 模块名

五、编码格式

默认编码格式为UTF-8

可以修改编码格式

#encoding=gbk
print('你好,中国!')

不同编码格式占用的磁盘空间大小不一样

六、文件读写原理

路径表示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

文件读写俗称“IO操作”(队列)

内置函数open()

使用内置函数open()创建文件对象

被创建的对象file = open(要创建或打开的文件名称filename,[,mode,encoding])

常用的文件打开模式

文本文件:记事本打开

二进制文件:专门的软件,如,mp3音频文件、jpg图片文件、doc文档

打开模式
在这里插入图片描述

r:只读,打开时指针放在文件开头

w:只写,不存在则创建,存在则覆盖原有内容,指针在文件开头

file = open("./c.txt",'w',encoding="utf-8")
file.write("hello world")
file.close()

a:追加,不存在则创建,指针在开头,存在则在末尾追加,指针在原文末尾

b:以二进制形式打开文件,不能单独使用,需与其他模式一起使用,如rb,wb

+:以读写方式打开,不可单独使用,需与 其他模式一起使用,如a+

文件对象常用方法

read([size]):从文件中读size个字节或字符的内容返回,若省略size,则读取到文件末尾

readline():从文本中读取一行

readlines():把每一行作为独立地字符串对象,并将这些对象放入列表返回

write(str):把字符串str写入文件

writelines(s_list):把字符串列表s_list写入文件,不添加换行符

seek(offset[,whence]):

把文件指针移到新地方,offset为相对于whence的位置

offset:

	为正:往结束方向移动

	为负:往开始方向移动

whence:

	0:从文件头开始计算(默认)

	1:从当前位置开始计算

	2:从文件尾开始计算

tell():返回文件指针当前位置

flush():把缓冲区的内容写进文件,但不关闭文件

close():把缓冲区的内容写入文件,同时关闭文件,释放文件对象相关资源

七、with语句(上下文管理器)

with语句可以自动管理上下文资源,不论什么原因跳出with块,都能确保文件正确关闭,以此达到释放资源的目的。

上下文管理器:实现了–enter–()方法和–exit–()方法,自动调用–enter–()方法,将返回值赋给as后面的file

八、os模块

os模块与os.path模块用于对目录或文件进行操作

例如,使用os打开可执行文件(打开QQ):

import os
os.startfile('C:\\Program Files (x86)\\Tencent\\QQ\\Bin\\qq.exe')

os模块常用函数

getcwd():返回当前的工作目录

import os
print(os.getcwd())	#E:\newStudy\python_workspace\chap15

listdir(path):返回指定路径下的文件和目录信息

import os
print(os.getcwd())				#E:\newStudy\python_workspace\chap15
lst = os.listdir('../chap15')	 # ../指退一级目录,因为改文件本身就在chap15文件夹下
print(lst)					   #得到chap15文件夹下的所有文件的列表

mkdir(path[,mode]):创建目录

os.mkdir('newdir')  #在该路径(chap15)下创建文件夹newdir

makedirs(path1/path2,…[,mode]):创建多级目录

os.makedirs('A/B/C')    #在该路径(chap15)下创建文件夹A,A中含B,B中含C

rmdir(path):删除目录

os.rmdir('newdir')

removedirs(path1/path2…):删除多级目录

os.removedirs('A/B/C')  #将A,A中的B,B中的C都删除

chdir(path):将path设置为当前工作目录

os.chdir('E:\\newStudy\\python_workspace\\chap14')
print(os.getcwd())	#E:\newStudy\python_workspace\chap14

os.path模块操作目录相关函数

abspath(path):获取文件或目录的绝对路径

import os.path
print(os.path.abspath('demo11.py'))	#E:\newStudy\python_workspace\chap15\demo11.py

exists(path):判断文件或目录是否存在,存在返回True,否则False

print(os.path.exists('demo11.py'))	#True

join(path,name):将目录与目录或者文件名拼接起来

print(os.path.join('E:\\newStudy\\python_workspace\\chap1','demo12.py'))
#	E:\newStudy\python_workspace\chap1\demo12.py

split():分离路径和文件名

print(os.path.split('E:\\newStudy\\python_workspace\\chap15\\demo11.py'))
#	('E:\\newStudy\\python_workspace\\chap15', 'demo11.py')

splitext():分离文件名和扩展名

print(os.path.splitext('E:\\newStudy\\python_workspace\\chap15\\demo11.py'))
#	('E:\\newStudy\\python_workspace\\chap15\\demo11', '.py')

basename(path):从一个目录中提取文件名

print(os.path.basename('E:\\newStudy\\python_workspace\\chap15\\demo11.py'))
#	demo11.py

dirname(path):从一个路径中提取文件路径,不包括文件名

print(os.path.dirname('E:\\newStudy\\python_workspace\\chap15\\demo11.py'))
#	E:\newStudy\python_workspace\chap15

isdir(path):用于判断是否为路径

print(os.path.isdir('E:\\newStudy\\python_workspace\\chap15\\demo11.py'))	#False 是文件
print(os.path.isdir('E:\\newStudy\\python_workspace\\chap15'))				#True 是目录

九、pip操作

pip操作相关扩展
pip -V                                                 查看pip的版本信息
pip list                                               查看当前项目的所有的python的扩展
python -m pip install --upgrade pip                    更新pip的版本
pip install 要安装的扩展的名字 -i 国内镜像的名字        -i表示国内镜像,可以加快下载速度
                                                       豆瓣的镜像源: https://pypi.doubanio.com/simple/
pip show 扩展的名字                                    查看扩展相关信息  eg:pip show numpy
pip uninstall 扩展的名字                               卸载相关扩展

另一种操作扩展的方式-->Pycharm解释器
File --> settings --> Project:XXX --> project interpreter
	+ 表示安装扩展包
	- 表示卸载扩展包

十、单例设计模式

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值