学习类后回顾pickle及collections模块应用场景优化

时间:2024-08-06 16:38:08

1.首先创建一个类,并给出一个对象

class Dog(object):
def __init__(self,name,kind,age):
self.name=name
self.kind=kind
self.age=age
jm=Dog('邻家大哥','金毛',3)

2.打开文件,用pickle.jump把对象转化为字节写入一个文件,可以查看是否创建文件,以及文件内是否有内容,在pcm也可以查看输出

import pickle
with open(r'd:\dog.txt','wb')as f:
pickle.dump(jm,f)

print(jm.__dict__)    #>>>{'name': '邻家大哥', 'kind': '金毛', 'age': 3}

print(jm.name)        #>>>'邻家大哥'

3.再次需要使用文件时,重新打开文件,读取内容

import pickle
with open(r'd:\dog.txt','rb')as f1:
jm=pickle.load(f1)
print(jm.__dict__) #>>>{'name': '邻家大哥', 'kind': '金毛', 'age': 3}
print(jm.kind) #>>>金毛

4.如果知道文件中数据对象数量,可以逐个命名,用多次pickle.load读取对象;

如果不知道文件中有多少数据对象,可用以下方法

import pickle
with open(r'd:\dog.txt','rb')ad f:
# jm1=pickle.load(f)
# jm2=pickle.load(f)
while 1:
try:
obj=pickle.load(f)
print(obj.__dict__)
except EOFError:
break

先创建一个(字典)类后,文件的读写用pickle方便简捷,多练多用

=====================================================================================================

二.collections模块中命名元祖与class类相似关系
class中,创建一个类,可以创建对象继承于类,与命名元祖相似,但是可以通过对象来修改属性,命名元祖却不行,类似于一个抽象类
先看看class中的抽象类

 from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta): #创造一个抽象类,不可以被实例化,没对象
@abstractmethod #装饰一个动作,使之成为规则,其子类不许有的规则
def pay(self): #规则可以有简单的动作,也可以直接pass
pass

创建子类,承受继承的规则,完成必须动作pay()

 class Wechatpay(Payment):
def __init__(self,name,money):
self.name=name
self.money=money
def pay(self):
print('%s通过微信支付了%s'%(self.name,self.money)) class Alipay(Payment):
def __init__(self,name,money):
self.name=name
self.money=money
def pay(self):
print('%s通过支付宝支付了%s' % (self.name, self.money)) class Applepay(Payment):
def __init__(self, name, money):
self.name = name
self.money = money
def pay(self):
print('%s通过苹果支付了%s' % (self.name, self.money))

最后,做归一化处理

 a2=Alipay('a2',300)
print(a2.__dict__) #>>>{'name': 'a2', 'money': 300}
a2.pay() #>>>a2通过支付宝支付了300
def pay(person): #归一化
person.pay()
pay(a2) #>>>a2通过支付宝支付了300

抽象类不能被实例化,没有init方法

命名元祖:

 from collections import namedtuple
course=namedtuple('a',['name','price','period']) #>>>创建一个命名元祖a,他又3个属性
python=course('python',2000,'6month') #>>>创建一个类似实例化对象python
print(python.price) #>>>2000 #命名元祖可以通过名字.属性,获取相应值 prthon=course('python',13,'sd') #通过命名元祖修改属性值
print(prthon.price) #13