十二、Python特殊方法和特殊属性
12.1 特殊方法
# yifan Python
class A:
pass
class B:
pass
class C(A,B):
def __init__(self,name,age):
self.name=name
self.age=age
#创建C类的对象
x=C('Jack',20) #x是C类型的一个实例对象
print(x.__dict__) #实例对象的属性字典
#{'name': 'Jack', 'age': 20}
print(C.__dict__) #C类型的属性
#{'__module__': '__main__', '__init__': <function C.__init__ at 0x00000186B2BC5000>, '__doc__': None}
print('----------------------------')
print(x.__class__)#输出对象所属类
#<class '__main__.C'>
##############查看继承那个类及哪些类##########################
print(C.__bases__)#C类的父类类型的元素
#(<class '__main__.A'>, <class '__main__.B'>)
print(C.__base__)#继承类
<class '__main__.A'>
print(C.__mro__) #类的层次结构
#(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
# yifan Python
#特殊方法
a=20
b=100
c=a+b #两个类型的相加操作
d=a.__add__(b) #__add__()相加函数的操作
print(c)
print(d)
#120
#120
class Student:
def __init__(self,name):
self.name=name
def __add__(self, other):################## 实现字符串加法运算的方法
return self.name+other.name
def __len__(self):
return len(self.name)
stu1=Student('Jack')############################
stu2=Student('李四')#################################
s=stu1.__add__(stu2)
print(s)
print('------------------------------')
lst=[11,22,33,44]
print(len(lst))#len是内容函数 计算长度
print(lst.__len__()) #需要编写__len函数__
s=stu1+stu2
print(s)
# def __add__(self, other):
调用
传参
12.2 类的浅拷贝与深拷贝
12.3 模块
# yifan Python
############################模块的使用
import math #关于数学运算math模块
print(id(math))
print(type(math))
#2074877932336
#<class 'module'>
print(math)
print(math.pi) #
#<module 'math' (built-in)>
#3.141592653589793
print('-------------------------------------------')
print(dir(math))#查看math模块的变量
print(math)
#['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'lcm', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'nextafter', 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc', 'ulp']
#<module 'math' (built-in)>
print(math.pow(2,3),type(math.pow(2,3))) #math.pow()函数 次方函数
print(math.ceil(9.001))#
print(math.floor(9.999))
#8.0 <class 'float'>
#10
#9
12.4 以主程序运行
12.5 Python中的包
12.6 Python中常用的内置模块
# yifan Python
#Python 常用标准库
import sys
import time
import urllib.request
print(sys.getsizeof(24))
print(sys.getsizeof(45))
print(sys.getsizeof(True))
print(sys.getsizeof(False))
print(time.time())
#28
#28
#28
#24
#1666708043.7710903
print('---------------------------------')
print(time.localtime(time.time()))
#time.struct_time(tm_year=2022, tm_mon=10, tm_mday=25, tm_hour=22, tm_min=27, tm_sec=58, tm_wday=1, tm_yday=298, tm_isdst=0)
#爬虫库
print(urllib.request.urlopen('http://www.baidu.com').read())
12.7 第三方模块的安装及使用
十三、系统文件
13.1 编码格式
13.2 文件的读写原理
#encoding=gbk
file=open('a.txt','r')
print(file.readlines())
file.close()
13.3 常用文件的打开模式
# yifan Python
# ‘w’
file=open('a.txt','w')#如果有a.txt文件则覆盖文本,如果没有a.txt文件则创建
file.write('中国11')
file.close()
# yifan Python
'a'
file=open('a.txt','a') #在原有文本后面追加
file.write('中国11追加')
file.close()
#中国11中国11追加
#'rb'
src_file =open('logo.png','rb')#必须有这个png文件
target_file=open('copylogo.png','wb')
target_file.write(src_file.read())#边读边写操作
target_file.close()
src_file.close()
#file=open('a.txt','r')
#file=open('c.txt','a')#追加
file=open('d.txt','a')#flush 把缓冲区内容文本文件
#读
#print(file.read(2))
#print(file.readline())
#print(file.readlines())
#写
#file.write('hello')
#lst=['java','go','python']
#file.writelines(lst)
#file.close()
#指针
file=open('a.txt','r') #a.txt 中内容中国/n 魅力。两个字节指向第二个字
file.seek(2)
print(file.read())
print(file.tell())#tell() 返回指针的当前位置
file.close()
#国#汉字一个字两个字节
#魅力
#29
#缓冲区文件写入文件
file=open('d.txt','a')
file.write('1111111111hello')
file.flush() #
file.write('world')
file.close()
#
#helloworldhelloworld1111111111helloworld
13.4 没懂with语句
13.5 OS模块
# yifan Python
#OS模块与操作系统相关的一个模块
import os
#os.system('notepad.exe')#打开记事本
os.system('calc.exe')#打开计算器
#直接调用可执行文件
os.startfile('D:\\Program Files\\Tencent\\QQ\\Bin\\qq.exe')
13.6 OS模块操作的相关函数
# yifan Python
import os
#print(os.getcwd())#获取当前工作路径
#F:\PycharmProjects\pythonTest
lst=os.listdir('./venv')
#print(lst)#获取指定路径下的文件和目录信息
#['.gitignore', 'demo3.py', 'Lib', 'pyvenv.cfg', 'Scripts']
#os.mkdir('newdir11111111')#创建目录
#os.makedirs('A/B/C')#连续创建多级目录A-B--C
#os.rmdir('newdir11111111')#删除目录
#os.removedirs('A/B/C')#删除多级目录
os.chdir('F:\PycharmProjects\pythonTest')#将path设置为当前目录
13.7 OS.path模块
# yifan Python
import os.path
print(os.path.abspath('OS模块.py'))
print(os.path.exists('多态的实现.py'),os.path.exists('ss'))
print(os.path.join('F:\PycharmProjects','OS模块.py'))
print(os.path.split('F:\PycharmProjects\pythonTest\OS模块.py'))#分割目录与文件名
print(os.path.splitext('OS模块.py')) #分割文件名与后缀
print('----------------------------------------')
print(os.path.basename('F:\PycharmProjects\pythonTest\OS模块.py'))#提取文件名
print(os.path.dirname('F:\PycharmProjects\pythonTest\OS模块.py'))#提取路径
print(os.path.isdir('F:\PycharmProjects\pythonTest\OS模块.py'))#判断是否为路径
#F:\PycharmProjects\pythonTest\OS模块.py
#F:\PycharmProjects\OS模块.py
#('F:\\PycharmProjects\\pythonTest', 'OS模块.py')
#('OS模块', '.py')
#----------------------------------------
#OS模块.py
#F:\PycharmProjects\pythonTest
#False
# yifan Python
#列出指定目录下的所有py文件
import os
path=os.getcwd()
print(path)
print('------------------')
lst=os.listdir(path)
for filename in lst:
if filename.endswith('.py'):#emdswith() 以py结尾的文件
print(filename)
# yifan Python
import os
path=os.getcwd()
lst_files=os.walk(path)
print(lst_files)
#<generator object _walk at 0x00000251626F9930>
print('---------------------')
for dirpath,dirname,filename in lst_files:
print(dirpath)
print(dirname)
print(filename)
十四、Python程序的打包
14.1 打包程序
win10系统
运行cmd
如果报错 不是内部程序
解决方法
此电脑->属性->高级系统设置->环境变量;添加下面两条路径;
一条python安装路径 一条PIP文件路径
14.2 win10 CMD打包指令
找到要打包程序的文件路径
在CMD中执行
pyinstaller -F F:\PycharmProjects\Studentsys\Student\Student.py
14.3 学生信息管理系统实战案例
# yifan Python
import os
filename='student.txt'
def main():
while True:
menum()
choice=int(input('请选择:'))
if choice in [0,1,2,3,4,5,6,7]:
if choice==0:
answer=input('你确定要退出系统吗?y/n')
if answer=='y' or answer=='Y':
print('谢谢你的使用')
break
else:
continue
elif choice==1:
insert() #录入学生信息
elif choice==2:
search() #查询信息
elif choice==3:
delete()#删除信息
elif choice==4:
modify()#修改信息
elif choice==5:
sort()#排序
elif choice==6:
total()#统计
elif choice==7:
show()#显示所有信息
def menum():
print('=====================学生管理系统=======================')
print('----------------------功能菜单-------------------------')
print('\t\t\t\t\t\t1.录入学生信息')
print('\t\t\t\t\t\t2.查找学生信息')
print('\t\t\t\t\t\t3.删除学生信息')
print('\t\t\t\t\t\t4.修改学生信息')
print('\t\t\t\t\t\t5.排序学生信息')
print('\t\t\t\t\t\t6.统计学生总人数')
print('\t\t\t\t\t\t7.显示所有学生信息')
print('\t\t\t\t\t\t0.退出系统')
print('-------------------------------------------------------')
def insert():
student_list=[]#要存储录入的学生
while True:
id=input('请输入ID(如1001):')
if not id:
break
name=input('请输入你的名字:')
if not name:
break
try:
englist=int(input('请输入你的english成绩:'))
python=int(input('请输入Python成绩:'))
java=int(input('请输入Java成绩:'))
except:#异常捕获
print('输入无效,不是整数类型,请重新输入')
continue #跳出本次循环
#将录入的学生信心保存到字典中
student={'id':id,'name':name,'englist':englist,'Python':python,'Java':java}
#将学生信息添加到列表中
student_list.append(student)#把字典student信息,添加到列表student_list
answer=input('请问是否添加?y/Y')
if answer=='y' or answer=='Y':
continue
else:
break
#保存学生信息,调用save()函数
save(student_list)
print('学生信息录入完毕!!!')
def save(lst):
try: #有文件的情况下
stu_txt=open(filename,'a',encoding='utf-8')#打开文件filename并'a',追加,使用utf8编码格式
except:#没有的情况下
stu_txt=open(filename,'w',encoding='utd-8')
for item in lst:#遍历字符串并写入stu_txt文件
stu_txt.write(str(item)+'\n')
stu_txt.close()
def search(): #查询
student_query=[]#读取所有字符串
while True:
id=''
name=''
if os.path.exists(filename):
mode=input('按ID查询请输入1,按姓名查询请输入2:')
if mode=='1':
id=input('请输入学生ID')
elif mode=='2':
name=input('请输入学生姓名:')
else:
print('你的输入有误,请重新输入')
search()#查询函数
with open(filename,'r',encoding='utf-8') as rfile:
student=rfile.readlines()#读取所有信息
for item in student:
d=dict(eval(item))#遍历文本信息后,转换成字典类型
if id!='':
if d['id']==id:
student_query.append(d)
elif name!='':
if d['name']==name:
student_query.append(d)
#显示查询结果
show_student(student_query)
#清空列表
student_query.clear()
answer=input('是否要继续查询?y/n\n')
if answer=='y':
continue
else:
break
else:
print('没有这个学生信息')
return
def show_student(lst):#查询结果
if len(lst)==0:#没有这个字符串
print('没有查询到学生信息,无数据显示!!!')
return
#定义标题的显示格式
format_title='{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}'
print(format_title.format('ID','姓名','英语成绩','Python成绩','Java成绩','总成绩'))
#定义内容的显示格式
format_data='{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}'
for item in lst:
print(format_data.format(item.get('id'),
item.get('name'),
item.get('english'),
item.get('Python'),
item.get('Java'),
int(item.get('englist'))+int(item.get('python')),+int(item.get('java'))
))
def delete():
while True:
student_id=input('请输入要删除的学生ID: ')
if student_id!='':
if os.path.exists(filename):#判断文件或者目录是否存在
with open(filename,'r',encoding='utf-8') as file:
student_old=file.readlines()#把ID存在的这个学生信息写入student_old
else:
student_old=[] #文件不存在
flag=False#标记是否删除
if student_old:#判断这个学生信息列表存在与否
with open(filename,'w',encoding='utf-8') as wfile:
d={}
for item in student_old:#遍历列表
d=dict(eval(item))#将字符串转换成字典,并赋给d
if d['id']!=student_id:#ID与遍历的列表不相等
wfile.write(str(d)+'\n')#将一条学生信息写入文件
else:
flag=True#否则标记删除
if flag:
print(f'id为{student_id}的学生信息已经被删除')
else:
print(f'没有找到ID为{student_id}的学生信息')
else:
print('无学生信息')
break
show() #删除之后要重新显示所有学生信息
answer=input('是否继续删除?y/n\n')
if answer=='y':
continue
else:
break
def modify():#修改学生信息
show()#读取所有学生信息
if os.path.exists(filename):#判断要修改该的文件信息是否存在
with open(filename,'r',encoding='utf-8') as rfile:
student_old=rfile.readlines()#文件信息整行写入student_old
else:
return
student_id=input('请输入要修改学院的ID:')
with open(filename,'w',encoding='utf-8') as wfile:
for item in student_old:#遍历文件信息
d=dict(eval(item))#以字典的形式输出#evel()返回字符串表达式
if d['id']==student_id:#如果有这个学生
print('找到学生信息,可以修改他的相关信息')
while True:#死循环
try:#多条信息
d['name']=input('请输入姓名:')
d['english']=input('请输入英语成绩:')
d['python']=input('请输入Python成绩:')
d['java']=input('请输入Java:')
except:
print('你的输入有误,请重新输入!')
else:
break
wfile.write(str(d)+'\n')
print('修改成功!!!')
else:
wfile.write(str(d)+'\n')#否则写入源文件
answer=input('是否继续修改其他学生信息?y/n\n')#修改完成后是否继续修改其他
if answer=='y':
modify()
def sort():
show()
if os.path.exists(filename):
with open(filename,'r',encoding='utf-8') as rfile:
student_list=rfile.readlines()
student_new=[]
for item in student_list:
d=dict(eval(item))#以字典的形式输出
student_new.append(d)
else:
return
asc_or_desc=input('请选择(0.升序 1.降序):')
if asc_or_desc=='0':#判断降序升序
asc_or_desc_bool=False
elif asc_or_desc=='1':
asc_or_desc_bool=True
else:
print('你的输入有误,请重新输入')
sort()
mode=input('请选择排序方式(1.按英语成绩排序 2.按Python成绩排序 3.按Java成绩排序 0.按总成绩排序):')
if mode=='1':
student_new.sort(key=lambda x:int(x['english']),reverse=asc_or_desc_bool)
if mode=='2':
student_new.sort(key=lambda x:int(x['python']),reverse=asc_or_desc_bool)
if mode=='3':
student_new.sort(key=lambda x:int(x['java']),reverse=asc_or_desc_bool)
if mode=='0':
student_new.sort(key=lambda x:int(x['english'])+int(x['python'])+int(x['java']),reverse=asc_or_desc_bool)
else:
print('你输入有误,请重新输入!!!')
sort()
show_student(student_new)
def total():
if os.path.exists(filename):
with open(filename,'r',encoding='utf-8') as rfile:
students=rfile.readlines()
if students:
print(f'一共有{len(students)}名学生')
else:
print('还没有录入学生信息')
else:
print('没有录入信息')
def show():#显示所有学生信息
student_lst=[]
if os.path.exists(filename):
with open(filename,'r',encoding='utf-8') as rfile:
students=rfile.readlines()
for item in students:
student_lst.append(eval(item))
if student_lst:
show_student(student_lst)
else:
print('暂未保存数据')
if __name__=='__main__':
main()
本文含有隐藏内容,请 开通VIP 后查看