静态方法
静态方法,只需要在方法前添加 @staticmethod, 方法就可以不写形参self,可以通过实例对象.方法名调用,也可以通过类名.方法名调用
例:
class Test:
@staticmethod
def test1():
print("你好")
def nums(self):
self.test1()
self.num1 = 2
self.num2 = 4
def sums(self):
print(self.num1+self.num2)
a = Test()
a.test1() #实例对象.方法名调用
Test.test1() #类名.方法名调用
结果:
你好
你好
类属性
类属性:让实例对象共用一个属性---类属性
使用方法:
- 对象名.属性
- 类名.属性名 (在类里面一定是这个)
实例属性:
class Test:
def __init__(self,name,age):
self.nums = 0 #因为是实例属性,每次都是重新创建
self.name = name
self.age = age
self.nums += 1
# Test.nums += 1
a1 = Test("张三",21)
a2 = Test("李四",22)
a3 = Test("李四",22)
a4 = Test("李四",22)
a5 = Test("李四",22)
print(a1.nums)
print(a5.nums)
结果:
1
1
类属性:
class Test:
nums = 0 #类属性:公用的
def __init__(self,name,age):
# self.nums = 0
self.name = name
self.age = age
# self.nums += 1
Test.nums += 1 #类属性进行操作
a1 = Test("张三",21)
a2 = Test("李四",22)
a3 = Test("李四",22)
a4 = Test("李四",22)
a5 = Test("李四",22)
print(a1.nums)
print(a5.nums)
print(Test.nums)
结果:
5
5
5
类方法
类方法:操作类属性(只需要在方法前添加 @classmothod)
使用方法:
- 对象.类方法()
- 类名.类方法() 推荐
class Test:
nums = 0
def __init__(self,name,age):
# self.nums = 0
self.name = name
self.age = age
# self.nums += 1
Test.nums += 1
@classmethod
def test_01(cls): #cls可以为其他形参
print(cls)
cls.nums += 3
print(cls.nums)
Test.test_01()
a1 = Test("张三",21)
print(a1.test_01)
print(Test.test_01)
结果:
<class '__main__.Test'> #指向类
3
<bound method Test.test_01 of <class '__main__.Test'>>
<bound method Test.test_01 of <class '__main__.Test'>>
__slots__
__slots__:限制实例的属性
class Test:
__slots__ = ("name","age","dcd")#限制实例的属性
def test_01(self):
pass
a = Test()
a.name = "zhangsan"
a.age = 21
a.dcd = "sksoc"
a.jineng = "python" #这个报错
python异常
异常:检测到错误,解释器无法继续执行,出现错误提示,即为异常(BUG 小虫子)
异常捕获
即为异常处理(捕获异常)
防止异常出现导致代码直接终止(异常一般不会影响后面的代码)
容错机制:程序一旦出现异常,直接处理异常,程序不直接终止,继续向下执行
- 整个程序因为BUG停止运行
- 对BUG进行提醒,整个程序继续运行
捕获异常作用:提前假设某处会出现异常,提前做好准备,当真的出现异常时,有后续手段
基本语法:
try:
可能发生错误的代码
except:
如果出现异常的代码
例1:
try:
file1 = open('D:\yfile.txt', 'r', encoding="UTF-8")
except:
print("出错了!!!,文件不存在,请以w模式打开文件")
结果:
出错了!!!,文件不存在,请以w模式打开文件
例2:
def devid_by(x,y):
return x/y
if __name__ == '__main__':
a = int(input("请输入一个整数a:"))
b = int(input("请输入一个整数b:"))
c = devid_by(a,b)
print(c)
print("我是后面的代码")
结果:
请输入一个整数a:4
请输入一个整数b:2
2.0
我是后面的代码
请输入一个整数a:4
请输入一个整数b:0 #报错因为除数不能为0
Traceback (most recent call last):
File "D:\edge下载\桌面美化\桌面文件夹\云计算\python\Day13\代码\04-__slots__.py", line 9, in <module>
c = devid_by(a,b)
File "D:\edge下载\桌面美化\桌面文件夹\云计算\python\Day13\代码\04-__slots__.py", line 2, in devid_by
return x/y
ZeroDivisionError: division by zero
解决方法:
def devid_by(x,y):
res = 0
try:
res = x/y
except:
return "除数不能为0"
return res
if __name__ == '__main__':
a = int(input("请输入一个整数a:"))
b = int(input("请输入一个整数b:"))
c = devid_by(a,b)
print(c)
print("我是后面的代码")
结果:
请输入一个整数a:4
请输入一个整数b:0
除数不能为0
我是后面的代码
优化:
def devid_by(x,y):
res = 0
try:
res = x/y
num3 = int(input("请输入num3:"))
print(x + y + num3)
except ZeroDivisionError as e: #ZeroDivisionError:除0错误(精准捕获)
return "除数不能为0" #as e:起个别名e
except ValueError as e: #ValueError:值错误
return "你输入的不是整数哦"
return res
if __name__ == '__main__':
a = int(input("请输入一个整数a:"))
b = int(input("请输入一个整数b:"))
c = devid_by(a,b)
print(c)
print("我是后面的代码")
结果:
请输入一个整数a:4
请输入一个整数b:2
请输入num3:3
9
2.0
我是后面的代码
请输入一个整数a:4
请输入一个整数b:0 #捕获到错误就不进行执行下去(num3)
除数不能为0
我是后面的代码
请输入一个整数a:4
请输入一个整数b:2
请输入num3:3.14
你输入的不是整数哦
我是后面的代码
扩展:
try:
可能出现异常的代码
except:
出现错误时执行的代码
else:
没有异常的时候执行的代码
finally:
不论是否会有异常都会执行 (目的:借助特性执行一些必须执行的代码)
finally
例:
def test():
a = 10
return a
print("111111111111") #不执行
a = test()
print(a)
test()
结果:
10
解决方法:
def test():
try:
a = 10
return a
except Exception as e:
pass
finally:
print("111111111111")
a = test()
print(a)
test()
结果:
111111111111
10
111111111111
扩展:
- BaseException 超类 (错误的总基类 如object)
- Exception 常规的错误的异常超类 (对于我们一般这个就够了)
查询异常的方法:
- win + r
- cmd + 回车(进入终端)
- python + 回车 (进入python解释器)
- import builtins (导入模块)
- dir(builtins)
捕获全部异常
异常的传递
异常具有传递性
自定义异常
自己定义没有的异常类
class My_error(Exception): # 继承常规的错误的异常超类
def __init__(self,msg):
Exception.__init__(self,msg)
def login(username,pwd):
if username != "admin":
raise My_error("用户名不存在") #raise:抛出异常
if pwd != "123456":
raise My_error("密码错误")
if __name__ == '__main__':
try:
login("ad","123")
except My_error as e:
print(e)
if __name__ == '__main__':
try:
login("admin","123")
except My_error as e:
print(e)
结果:
用户名不存在 #第一个错误后面就不判断了
密码错误
python的文件操作
i/o流(input output stream):输入输出流
内存数据和磁盘这种可以永久存储数据的设备间的数据流动问题。
完整流动顺序:磁盘---内存----cpu----内存---磁盘 :输入流 :输出流
包括网络上的数据请求……
内存是最重要的缓冲设备
I/O流分类:
数据的流动方向:(站在内存角度)
输入流:磁盘上的文件读取到内存中,是输入流
输出流:将数据从内存存储在磁盘中,输出流
数据的类型分类:
字节流(01010101):媒体文件等
字符流:效率较高,但字节流是根本
python通过open函数操作io流
文件的编码
计算机只认识0-1,使用编码技术(密码本)将内容翻译成0和1存入硬盘
计算机有很多的可用编码(不同的密码本):
读写文件编码必须一致
utf-8:目前全球通用的编码格式
gbk;`````
文件的操作
文件:
操作:打开、读、写、关闭
open( )
open( )为全局方法,无需导入模块
常用:
open(file,mode="r",encoding ="UTF-8")
file:文件路径(目标文件名的字符串) (同一路径直接写文件名)
mode="r":可读 (打开文件的模式 只读 r、写入、追加) (默认为可读)
encoding ="UTF-8":编码格式返回一个数字,标识文件
例:
f = open("test.txt")
print(f)
结果:
<_io.TextIOWrapper name='test.txt' mode='r' encoding='cp936'>
>>> f = open("test.txt","r",encoding="UTF-8")
>>> f
<_io.TextIOWrapper name='test.txt' mode='r' encoding='UTF-8'>
>>>
f的方法
文件读取
read( )
文件对象.read(读取的数据的长度)
读取的数据的长度为空:读取全部内容 默认是-1,即读取到最后一位
>>> f.read()
'1\n2\n3\n4'
>>> f.read(1) #因为之前读完了,读的指针就指向最后了
''
>>> f = open("test.txt","r",encoding="UTF-8")
>>> f.read(1)
'1'
>>> f.read(1)
'\n'
>>> f.read(1)
'2'
>>> f.read(1)
'\n'
>>> f.read(1)
'3'
>>> f.read(1)
'\n'
>>> f.read(1)
'4'
>>> f.read(1) #读完后就读不到了
''
>>> f.read(1)
''
>>>
seek(0)
文件对象.seek(光标的位置):重新指定指针的位置
指针,第一次读取数据之后,指针移动到最后边,无法再读取
>>> f.read(1)
'4'
>>> f.read(1) #读完后就读不到了
''
>>> f.read(1)
''
>>> f.seek(0)
0
>>> f.read(1)
'1'
>>>
readable()
文件对象.readable( ):判断文件是否可读
>>> f.readable()
True
>>>
writable()
文件对象.writable( ):判断文件是否可写
>>> f.writable()
False
>>>
close()
文件对象.close( ): 关闭文件
如果不将文件关闭,关机时或删除文件时都会显示运行
>>> f.close()
>>> f.closed
True
>>>
closed
文件对象.closed 判断文件是否关闭
>>> f.closed
False
>>>
readline()
文件对象.readline() : 读取行(针对字符数据的)
>>> f.readline()
'1\n'
>>>
readlines()
文件对象.readlines() : 将每一行作为一个元素,最后以列表的形式返回
>>> f.readlines()
['1\n', '2\n', '3\n', '4']
>>>
for i in 文件对象:
for i in 文件对象: 遍历循环文件对象(i为文件对象里每行的数据,以字符串格式返回)
f1 = open("1.txt","r",encoding="UTF-8")
print(f1) #返回的这是基础信息,不是文件里的数据
print(f1.readlines())
f1.seek(0) #因为上面进行readlines操作,指针已经到最后,需重新归0
for i in f1: #遍历循环f1
print(i, type(i))
结果:
<_io.TextIOWrapper name='1.txt' mode='r' encoding='UTF-8'>
['张三,1000r,出差,测试\n', '李四,200r,吃饭,正式\n', '王五,1200r,出差,正式\n',
'蔡,200r,打游戏,正式\n', '孙2,1000r,买东西,测试\n', '张飞,200r,吃饭,正式']
张三,1000r,出差,测试
<class 'str'>
李四,200r,吃饭,正式
<class 'str'>
王五,1200r,出差,正式
<class 'str'>
蔡,200r,打游戏,正式
<class 'str'>
孙2,1000r,买东西,测试
<class 'str'>
张飞,200r,吃饭,正式 <class 'str'>
文件写入
>>> f = open("test.txt","w",encoding="UTF-8")
>>> f.writable()
True
>>>
write( )
文件对象.write(写入的数据 ) : 写入的数据积攒在程序的内存中(相当于写入未保存)
注意:并且会删除文件里原本的数据(相当于覆盖)
文件的追加,将w模式替换称a模式即可,不会把原来内容进行覆盖
>>> f.write("hh")
2
>>>
flush( )
文件对象.flush(): 内容刷新(内容真正写入文件)
>>> f.flush()
>>>