模式 | 操作 | 作用 |
- f=open('t1.txt','w')
-
- f.write('prthon是一种非常好的语言,\n我喜欢python\n') #写入
- f.close() #关闭
二进制模式:一般用于读取图片,视频等二进制文件
注意:b模式是以byte类型读取文件的,返回的是byte对象不是字符串,必须指定编码格式
- s='this is a test'
- b=bytes(s,encoding='utf-8')
- f=open('test.txt','wb')
- f.write(b)
- f.close()
read(size):读取一定大小的数据,然后作为字符串或字节对象返回,size为可选参数,用于指定读书的数据流,size忽略或为负数时表示改文件所以内容都将被读取并返回
- f=open('test.txt','r')
- str1=f.read()
- print(str1)
- str1=f.read(4)
- print(str1)
- f.close()
- f=open('test.txt','r')
- str1=f.readline()
- print(str1)
- f.close()
readlines():将文件所有行,一行一行全部读取到一个列表中,按顺序存储到列表
- f=open('test.txt','r')
- str1=f.readlines()
- print(str1)
- f.close()
8.2.7遍历文件
实际上可以将文件对象作为一个迭代器使用
- f=open('test.txt','r')
-
- for i in f:
- print(i,end=' ')
-
- f.close()
8.2.8.小结:几种不同的读取文件方法,若文件容量小使用read()一次性读写较为方便,若不能确定文件大小则可以使用read(size)反复测试,若是配置文件可以使用readlines()较为方便或者for循环变量
8.2.9.写入方法:write()
作用:将字符串或字节数据写入文件
write()多次操作实际是在内存中完成,并不会立即写入磁盘,只有close()后操作同步到磁盘
格式:文件对象.write('内容')
8.2.10.tell():返回文件读写指针的位置,从文件开头算起的字节数
8.2.11.seek():移动若干字符到指定位置,如:seek(x,1)表示从当前
- f=open('test.txt','rb+')
- f.write(b'123456789')
- f.tell()
- print(f.seek(5))
- print(f.seek(1))
- print(f.seek(2,2))
- print(f.seek(3,1))
- f.close()
- #(x,数字),数字有0,1,2,0表示从文件开头算起,1表示从文件读写指针的位置开始算起,2表示从文件结尾起,默认为0
- # dumps 序列化为字符数据
- import pickle
-
- list1 = [10, 20, 30, 40, 50]
- data1 = pickle.dumps(list1)
- print(data1)
-
- f = open('test2.txt', mode='wb')
- f.write(data1)
- f.close()
-
- f = open('test2.txt', mode='rb')
- data2=f.read()
- print(data2)
- f.close()
# loads 反序列化
#loads 序列化为字节数据
- # dumps 序列化为字符数据
- import pickle
-
- f = open('test2.txt','rb')
- show=f.read()
- show=pickle.loads(show)
- print(show)
- f.close()
-
-
例:将字符串序列化存储到test3.txt中,读取后反序列化输出
- # dump
- import pickle
-
- str1 = ['china', 'hello', '123456', 'world']
- pickle.dump(str1, open('test3.txt', 'wb'))
- f = open('test3.txt', 'wb')
- print(f.read())
- f.close()
-
- # load
- str2 = pickle.loads(open('test3.txt', 'rb'))
- print(str2)
- # dump
- import json
-
- data1={'username':'张三','age:':17,'number':33}
- print(json.dumps(data1))
-
- f = open('test4.txt', 'wb')
- f.open('test.txt','wt')
- f.write(data1)
- f.close()
-
注意:打开文件方式为wt,字符形式
实体 | 属性 |
手机 | 价格,品牌,操作系统,颜色,尺寸 |
人 | 身高,体重,姓名,年龄,学历,电话,籍贯等 |
第三步:让实体执行相应的功能和动作
学生:提出报名
学生:提供相应资料
教师:等级学生信息
机构:收费
教师:分配教师
班级:增加学生信息
经典类
- class 类名:
- ...类的信息...
- 代码
新式类:
- class 类名():
- ...类的信息...
- 代码
- class Person():
- #属性
- #方法(函数)
- def eat(self):
- print('我喜欢吃')
- def drink(self):
- print('我喜欢喝可乐')
-
- class Geese:
- '''大雁类'''
- pass
特别注意:
类本质也是一个对象
python一切皆为对象,类是一个特殊的对象即
类对象运行也会被加载到内存
类对象在内存‘中只有一份,可以创建出多个对象实例
- # 1.定义一个类
- class Person():
- #方法关联方法
- def eat(self):
- print('我喜欢吃')
- def drink(self):
- print('我喜欢喝可乐')
-
- #实例化对象
- p1=Person()
-
- # 调用对象的方法实现功能
- p1.eat()
- p1.drink()
- # 1.定义一个类
- class Person():
- #定义关联方法
- def eat(self):
- print('我喜欢吃')
- print(self)
- def drink(self):
- print('我喜欢喝可乐')
-
- #2.实例化对象
- p1=Person()
- p2=Person()
-
- p1.eat()
- p2.eat()
总结:类中self就是实例化的对象本身
- class Geese:
- '''大雁类'''
- def __init__(self,beak,wing,claw):
- print('大雁类')
- print(beak)
- print(wing)
- print(claw)
-
- beak1='有较长的嘴'
- wang1='翅膀长而尖'
- clwa1='爪子为'
-
- wil=Geese(beak1,wang1,clwa1)
_ _init_ _()方法必须包含一个参数self,位置必须是第一个,self本质是指向实例对象本身
_ _init_ _()方法双线划线开头和结尾,下划线之间不能有空格
_ _init_ _ ()方法可以自己定义一些参数,都好隔开
例
- # 1.定义一个类
- class Person():
- #初始化实例对象
- def __init__(self,name,age):
- self.name=name
- self.age=age
-
- #2.实例化对象并传入初始化的参数
- p1=Person('悟空',500)
-
- # 3.调用P1对象自身的属性
- print(p1.name)
- print(p1.age)
- def 方法名 (self,其它形参)
- 方法体
- #开发一个游戏
- class Game(object):
- #开始游戏,打印游戏功能菜单
- @staticmethod #装饰器声明下面方法为静态方法
- def menu():
- print('1.开始游戏')
- print('2.游戏暂停')
- print('3.退出游戏')
-
- Game.menu() #不需要创建对象,通过类名.方法名调用
9.3.8.创建类的属性
- class Geese:
- '''大雁类'''
- neck='脖子较长'
- wing='翅膀的频率高'
- leg='腿位于身体中心支点'
-
- geese1=Geese()
- print(Geese.neck) #通过 类名.属性名 访问
- print(Geese.wing) #通过 类名.属性名 访问
- print(Geese.neck) #通过 类名.属性名 访问
示例图
类属性一旦变更,所有对象的属性都会变化
- class Geese:
- '''大雁类'''
- neck='脖子老长较长'
- wing='翅膀的频率高'
- leg='腿位于身体中心支点'
-
- geese1=Geese()
- geese2=Geese()
-
-
- print(geese1.neck)
- print(geese2.neck)
注意:不能使用对象.属性=值 方法
9.
- class Person:
- pass
-
- p1=Person()
-
- p1.name='老王'
- p1.age=22
- p1.address='192.168.80.133'
-
- p2=Person()
-
- print(p2.name) #报错,name是p1的对象属性,私有
- class Person:
- def speak(self):
- print(f'我的名字:{self.name},我的年龄:{self.age},我的地址:{self.address}')
-
-
- p1=Person()
-
- p1.name='悟空'
- p1.age=500
- p1.address='花果山水帘洞1号'
-
- p1.speak()
9.4.魔术方法
9.4.1.在python中_ _ xxx_ _()的函数称为魔术方法,指具有特殊功能的函数
9.4.2._ _str_ _()方法
- class Car():
- # 首先定义一个初始化方法,用于初始化实例对象的属性
- def __init__(self, brand, model, color):
- self.brand = brand
- self.model = model
- self.color = color
-
- def __str__(self):
- return f'汽车品牌:{self.brand},汽车型号:{self.model},汽车颜色:{self.color}'
-
-
- model3 = Car('奔驰', 's600', '黑色')
- print(model3)
9.4.3._ _del_ _()方法
- class Car():
- # 首先定义一个初始化方法,用于初始化实例对象的属性
- def __init__(self, brand, model, color):
- self.brand = brand
- self.model = model
- self.color = color
-
- def __str__(self):
- return f'汽车品牌:{self.brand},汽车型号:{self.model},汽车颜色:{self.color}'
-
- del __del__(self):
- print(f'{self}对象已删除')
-
- model3 = Car('奔驰', 's600', '黑色')
- print(model3)
-
-
- # 删除对象model3
- del model3 #自动调用__del__()方法
9.5面向对象程序设计案例
9.5.1.例:定义学院信息类,包含姓名,成绩属性。定义成绩打印方法,打印等级成绩(90以上优秀,80以上良好,70以上中等,60以上及格)
实体:学员
属性:
方法:
- # 1.创建学员类
- class Student():
- # 2.定义学员属性
- def __init__(self, name, score):
- self.name = name # 所有对象的名字来自哪里
- self.score = score
-
- def print_grade(self):
- if self.score >= 90:
- print(f'学员姓名:{self.name},学员成绩:{self.score},优秀')
- elif self.score >= 80:
- print(f'学员姓名:{self.name},学员成绩:{self.score},良好')
- elif self.score >= 70:
- print(f'学员姓名:{self.name},学员成绩:{self.score},中等')
- elif self.score >= 60:
- print(f'学员姓名:{self.name},学员成绩:{self.score},及格')
- else:
- print(f'学员姓名:{self.name},学员成绩:{self.score},补考')
-
-
- name1 = input('请输入姓名')
- score1 = input('请输入成绩')
- tom = Student(name1, score1)
- tom.print_grade()
9.5.2.例2.小明体重120公斤,每次跑步减掉0.5公斤,每次吃饭增加1公斤
实体:小明
属性
方法:
跑步
吃饭
-
- class Person():
- def __init__(self, name, weight):
- self.name = name # 所有对象的名字来自哪里
- self.weight = weight
-
- def run(self):
- self.weight-=0.5
-
- def eat(self):
- self.weight+=1
-
- def __str__(self):
- return f'名字:{self.name},目前体重:{self.weight}KG'
-
- xiaoming=Person('小明',120)
- print(xiaoming) #利用str魔术方法返回信息
-
- xiaoming.eat()
- print(xiaoming)
-
- xiaoming.run()
- print(xiaoming)
9.5.3.例3:编写prime类实现输出大于m且紧随m的k个素数
实体:数字
属性: m k
方法:判断实现大于m且紧随m的k个素数
- class Prime():
- def __init__(self, start_value, number):
- self.start_value = start_value # 所有对象的名字来自哪里
- self.number = number
-
- def prime_number(self):
- count = 0
- i = self.start_value + 1
-
- while count < self.number:
- for j in range(2, i):
- if i % j == 0:
- break
- else:
- count += 1
- print(i, end=' ')
- i+=1
-
-
- m = int(input('请输入起始值'))
- k = int(input('请输入查找个数'))
-
- prime1=Prime(m,k)
- prime1.prime_number()
95.4.例:编写Mysort类实现整数升序排序
实体:list列表
属性:list len
方法 :选择法升序
- class Mysort():
- def __init__(self, list1):
- self.list1 = list1
-
- def selection_sort(self):
- if len(self.list1) == 0:
- return '数据不能为空'
-
- self.list1 = list(self.list1) # 将字符串数字转为字符串列表
- self.list1 = [int(self.list1[i]) for i in range(len(self.list1))]
-
- # 选择法排序
- for i in range(len(self.list1) - 1):
- for j in range(i + 1, len(self.list1)):
- if self.list1[i] > self.list1[j]:
- self.list1[i], self.list1[j] = self.list1[j], self.list1[i]
- return self.list1
-
-
- li = input('请输入需要排序的序列:')
- mysort1 = Mysort(li)
- print(mysort1.selection_sort())