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

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中的抽象类

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

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

 1 class Wechatpay(Payment):
 2     def __init__(self,name,money):
 3         self.name=name
 4         self.money=money
 5     def pay(self):
 6         print('%s通过微信支付了%s'%(self.name,self.money))
 7 
 8 class Alipay(Payment):
 9     def __init__(self,name,money):
10         self.name=name
11         self.money=money
12     def pay(self):
13         print('%s通过支付宝支付了%s' % (self.name, self.money))
14 
15 class Applepay(Payment):
16     def __init__(self, name, money):
17         self.name = name
18         self.money = money
19     def pay(self):
20         print('%s通过苹果支付了%s' % (self.name, self.money))

最后,做归一化处理

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

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

命名元祖:

1 from collections import namedtuple              
2 course=namedtuple('a',['name','price','period'])         #>>>创建一个命名元祖a,他又3个属性
3 python=course('python',2000,'6month')                    #>>>创建一个类似实例化对象python
4 print(python.price)                                      #>>>2000    #命名元祖可以通过名字.属性,获取相应值
5 
6 prthon=course('python',13,'sd')                          #通过命名元祖修改属性值  
7 print(prthon.price)                                      #13
原文地址:https://www.cnblogs.com/OB19227/p/10615651.html