zoukankan      html  css  js  c++  java
  • 学习类后回顾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
  • 相关阅读:
    ES5 ES6 作用域声明部分
    js 内建函数reduce
    $apply的使用与否
    得分-星星
    CSS3中translate、transform和translation的区别和联系
    vue 学习笔记
    -webkit-line-clamp 多行文字溢出...
    八位二进制数为什么表示范围(-128~~+127)理解
    vs2017_enterprise正式版离线安装包bt下载
    RSA密钥之C#格式与Java格式转换
  • 原文地址:https://www.cnblogs.com/OB19227/p/10615651.html
Copyright © 2011-2022 走看看