天天看点

20190515类的封装练习

文章目录

  • ​​20190515类的封装练习​​
  • ​​1、随机整数生成类​​
  • ​​第一种思路​​
  • ​​第二种封装思路​​
  • ​​第三种思路​​
  • ​​2、打印坐标​​
  • ​​3、车辆信息​​
  • ​​4、实现温度的处理​​
  • ​​第一种思路​​
  • ​​第二种思路​​
  • ​​5、模拟购物车购物​​

20190515类的封装练习

1、随机整数生成类

可以先设定一批生成数字的个数,可设定指定生成的数值的范围。运行时还可以调整每批生成数字的个数

第一种思路

#第一种封装思路,比较笨重
import random
class PartNum:
    def __init__(self,minnum=0,maxnum=1,count=10):
        self._maxnum = maxnum
        self._minnum = minnum
        self._count = count

    def setminnum(self,minnum):
        self._mininum = minnum

    def setcount(self,count):
        self._count = count

    def getcount(self):
        return self._count
    #注册minnum属性get,set方法
    minnum = property(lambda self:self._minnum,setminnum)
    #注册count属性get,set方法
    count = property(getcount,setcount)

    @property
    def maxnum(self):
        return self._maxnum

    @maxnum.setter
    def maxnum(self,maxnum):
        self._maxnum = maxnum

    def partrandom(self):
        """产生随机数方法"""
        mmax = self._maxnum
        mmin = self._minnum
        return (random.randint(mmin,mmax) for _ in range(self._count))
#         return (random.randint(self._minnum,self._maxnum) for _ in range(self._count))

if __name__ == "__main__":
    parnum = PartNum()
    rom1 = parnum.partrandom()
    parnum.count = 20
    parnum.maxnum = 30
    rom2 = parnum.partrandom()
    print([_ for _ in rom1])
    print([_ for _ in rom2])      

第二种封装思路

  • 生成器实现
#第二种封装思路,生成器实现
import random

class RandomGen:
    def __init__(self,start=1,stop=100,count=10):
        self.start = start
        self.stop = stop
        self.count = count
        self._gen = self._generate()
        
    def _generate(self):
        while True:
            yield random.randint(self.start,self.stop)
            
    def generate(self,count=0):
        count = count if count else self.count
        return [next(self._gen) for i in range(count)]
    
print(RandomGen().generate())      

第三种思路

  • 每一次生成一批数据
# 第三种封装思路,每次生成一批数据
import random

class RandomGen:
    def __init__(self,start=1,stop=100,count=10):
        self.start = start
        self.stop = stop
        self._count = count
        self._gen = self._generate()
        
    def _generate(self):
        while True:
            yield [random.randint(self.start,self.stop) for _ in range(self._count)]
            
    def generate(self,count=0):
        return next(self._gen)
    
    @property
    def count(self):
        return self._count
    
    @count.setter
    def count(self,count):
        self._count = count
        
rand = RandomGen()
print(rand.generate())
rand.count = 5
print(rand.generate())
rand.stop = 10
rand.count = 20
print(rand.generate())      

2、打印坐标

使用上题中的类,随机生成20个数字,两两配对形成二维坐标系的坐标,把这些坐标组织起来,并打印输出

import random

#定义一个生成器类
class RandomGen:
    def __init__(self,start=1,stop=100,count=10):
        self.start = start
        self.stop = stop
        self._count = count
        self._gen = self._generate()
        
    def _generate(self):
        while True:
            yield [random.randint(self.start,self.stop) for _ in range(self._count)]
            
    def generate(self,count=0):
        return next(self._gen)
    
    @property
    def count(self):
        return self._count
    
    @count.setter
    def count(self,count):
        self._count = count

#定义坐标类
class Point:
    def __init__(self,x,y):
        self.x = x
        self.y = y
        
    def __str__(self):
        return "<Point x:{},y:{}>".format(self.x,self.y)
    
    def __repr__(self):
        return "<Point x:{},y:{}>".format(self.x,self.y)

if __name__ == "__main__":
    rand = RandomGen()
    rand.count = 10
    points = [Point(x,y) for x,y in zip(rand.generate(),rand.generate())]
    print(points)      

3、车辆信息

from collections import defaultdict
#定义汽车类
class Automobile:
    def __init__(self,mark,color,price,speed):
        self.mark = mark  #品牌
        self.color = color #颜色
        self.price = price #价格
        self.speed = speed #速度
        
    def getmessage(self):
        return "品牌:{}\t颜色:{}\t售价:{}万元\t速度:{}km/h".format(self.mark,self.color,self.price,self.speed)
        
class Platform:
    def __init__(self):
        self.__goodsdict = defaultdict(lambda : [0,set()])
        self.__goodsNum = 0
        pass
    #注册商品数量属性
    goodsNum = property(lambda self:self.__goodsNum)
    
    def add(self,goods:Automobile):
        """添加平台物品"""
        self.__goodsNum += 1
        self.__goodsdict[goods.mark][0] += 1
        self.__goodsdict[goods.mark][1].add(goods)
    
    def showplatform(self):
        """展示平台物品信息"""
        print("- "*5,"车辆总数:",self.__goodsNum,"- "*5)
        for name,arr in self.__goodsdict.items():
            print("{} 总数量:{}".format(name,arr[0]))
            for goods in arr[1]:
                print("\t{}".format(goods.getmessage()))

if __name__ == "__main__":
    #创建管理平台
    pla = Platform()
    #添加车辆
    pla.add(Automobile("上海大众","黑色",5.0,300))
    pla.add(Automobile("上海通用","黑色",30.0,400))
    pla.add(Automobile("玛莎拉蒂","酒红色",200.0,600))
    pla.add(Automobile("玛莎拉蒂","黑色",200.0,600))
    pla.add(Automobile("宝马","磨砂黑",200.0,600))
    pla.add(Automobile("宝马","白色",200.0,600))
    pla.add(Automobile("劳斯莱斯","黑色",500.0,700))
    #显示全部车辆
    pla.showplatform()      

4、实现温度的处理

第一种思路

import math
class Trmperatuer:
    _cTof = 1 #摄氏温度转华氏温度
    _cTok = 2 
    _fTok = 3
    _fToc = -1
    _kToc = -2
    _kTof = -3
    cTof = _cTof
    cTok = _cTok
    fTok = _fTok
    fToc = _fToc
    kToc = _kToc
    kTof = _kTof
    _modedict = {_cTof,_cTok,_kToc,_kTof,_fToc,_fTok}

    _condict={
        _cTof:lambda c: 9*c/5 +32,
        _cTok:lambda c: c+273.15,
        _fToc:lambda f: 5*(f-32)/9,
        _fTok:lambda f: 5*(f-32)/9+273.15,
        _kToc:lambda k: k-273.15,
        _kTof:lambda k: (k-273.15)*9/5 + 32
    }
    
    def convert(self,trm:int,mode:int):
        if mode in Trmperatuer._modedict:
            return round(self._condict[mode](trm),2)
            
        
if __name__ is "__main__":
    trm = Trmperatuer()
    print("0摄氏温度转华氏温度:",trm.convert(0,Trmperatuer.cTof))
    print("0摄氏温度转开氏温度:",trm.convert(0,Trmperatuer.cTok))
    print("0华氏温度转摄氏温度:",trm.convert(0,Trmperatuer.fToc))
    print("0华氏温度转开氏温度:",trm.convert(0,Trmperatuer.fTok))
    print("0开氏温度转摄氏温度:",trm.convert(0,Trmperatuer.kToc))
    print("0开氏温度转华氏温度:",trm.convert(0,Trmperatuer.kTof))      

第二种思路

  • 假定一般情况下,使用摄氏温度为单位,传入温度值。如果不给定摄氏温度,一定会把温度值转换到摄氏度。
class Temperature:
    def __init__(self,t,unit='c'):
        self._c = None
        self._f = None
        self._k = None
        
        #都要先转换到摄氏度,以后反问再计算其他单位的温度值
        if unit == 'f':
            self._c = self.f2c(t)
        elif unit == 'k':
            self._c = self.k2c(t)
        elif unit == 'c':
            self._c = t
    @property
    def c(self):
        return self._c

    @property
    def f(self):
        if self._f is None:
            self._f = self.c2f(self._c)
        return self._f
    
    @property
    def k(self):
        if self._k is None:
            self._k = self.c2k(self._c)
        return self._k

    @classmethod
    def c2f(cls,c):
        return 9 * c / 5 +32
    
    @classmethod
    def f2c(cls,f):
        return (f - 32) * 5 / 9
    
    @classmethod
    def c2k(cls,c):
        return c + 273.15

    @classmethod
    def k2c(cls,k):
        return k - 273.15
    
    @classmethod
    def f2k(cls,f):
        return cls.c2k(cls.f2c(f))
    
    @classmethod
    def k2f(cls,k):
        return cls.c2f(cls.k2c(k))
    
if __name__ == "__main__":
    print(Temperature.c2f(0))
    print(Temperature.c2k(0))
    print(Temperature.f2c(0))
    print(Temperature.f2k(0))
    print(Temperature.k2f(0))
    print(Temperature.k2c(0))
    temp = Temperature(0,'f')
    print(temp.c,temp.f,temp.k)      

5、模拟购物车购物

from collections import defaultdict
class Goods:
    """物品类"""
    def __init__(self,id,name,price,num,color,goodtypes):
        """
        物品初始化
        :param id :商品id
        :param name: 物品名称
        :param price:  物品价格
        :param num: 物品数量
        :param color: 颜色
        :param goodtypes:  类型
        """
        self.id = id
        self.name = name
        self.price = price
        self.num = num
        self.color = color
        self.goodtypes = goodtypes
        pass

    def show(self,v:int=0):
        v = v if v else self.num
        return "id:{}\t名称:{:<20}\t单价:{}\t数量:{:<3}\t颜色:{}\t类型:{}".format(self.id,self.name,self.price,v,self.color,self.goodtypes)

class Salse:
    """销售平台"""
    def __init__(self):
        self.goodsdict = dict()
        pass

    def addgoods(self,goods:Goods=None):
        """添加商品"""
        if not goods:
            id = int(input("请输入商品id:"))
            name = input("请输入商品名称:")
            price = float(input("请输入商品价格:"))
            num = int(input("请输入商品数量:"))
            color = input("请输入商品颜色:")
            goodtypes = input("请输入商品类型:")
            goods = Goods(id,name,price,num,color,goodtypes)
        if goods.id in self.goodsdict:
            self.goodsdict[goods.id].num += goods.num
        else:
            self.goodsdict[goods.id] = goods

    def sellGoods(self,dt:dict):
        """
        销售商品
        :param dt:  销售商品集合
        :return:
        """
        for good in dt:
            if good.id in self.goodsdict:
                num = self.goodsdict[good.id]-good.num
                if num>0:
                    self.goodsdict[good.id].num = num
                else:
                    self.goodsdict.pop(good.id)
        pass

    def showGoods(self):
        """查看正在售卖商品"""
        for k,good in self.goodsdict.items():
            print(good.show())
        pass

class ShoppingCat:
    """购物车"""
    def __init__(self,salse:Salse):
        self.__dict = {} #购物车商品
        # self.__sumprice = 0 #总价
        # self.__num = 0 #所有商品数量
        self.salse = salse
        pass

    def addGoods(self,goopid,num):
        """购物车中添加商品"""
        if num>0 and goopid in self.salse.goodsdict:
            #获取商品总量
            maxnum = self.salse.goodsdict[goopid].num
            sum = self.__dict.get(goopid,0) + num
            if maxnum<=sum: sum = maxnum
            self.__dict[goopid] = sum

    def defGoods(self,goopid,num:int=0):
        """
        删除物品
        :param goopid:  物品id
        :param num: 删除的数量,如果为0表示全部删除
        :return:
        """
        if goopid in self.__dict:
            if num>0:
                self.__dict[goopid] -= num
            else:
                self.__dict.pop(goopid)
            return True
        else:
            return False

    def showShopping(self):
        """
        查看购物车商品
        :return:
        """
        sum = 0 #总金额
        num = 0 #商品数量
        print("购物车信息如下:")
        if self.__dict:
            for k,v in self.__dict.items():
                good:Goods = self.salse.goodsdict[k]
                num += v
                sum += good.price*v
                print(good.show(v))
            print("一共{}件商品,共{}元".format(num,sum))
        else:
            print("购物车为空。。。。。")

    def closeShopping(self):
        """
        清空购物车
        :return:
        """
        self.__dict = {}  # 购物车商品
        self.__sumprice = 0  # 总价
        self.__num = 0  # 所有商品数量
        return True

    def gotoGoods(self):
        """
        结账
        :return:
        """
        sum = 0
        num = 0
        strshopping = ""
        if self.__dict:
            for k,v in self.__dict.items():
                good:Goods = self.salse.goodsdict[k]
                strshopping += good.show(v)+"\n"
                if v>=good.num:
                    num += good.num
                    sum += good.num*good.price
                    self.salse.goodsdict.pop(k)
                else:
                    good.num -= v
                    num += v
                    sum += v*good.price
            print("已经将{}件商品打包,发往XXXXXX。共收款{}元。".format(num,sum))
            print("邮寄商品信息如下:\n"+strshopping)
            self.closeShopping()
        else:
            print("没有选购任何商品。。。。")
        return True

class Console:
    """控制台"""
    def __init__(self,salse:Salse,shopp:ShoppingCat):
        self.salse = salse
        self.shopp = shopp
        pass

    def show1(self):
        """启动控制台"""
        print("控制台已经启动")
        while 1:
            print("1.查看商品")
            print("2.选择商品加入购物车")
            print("3.查看购物车")
            print("4.清空购物车")
            print("5.添加出售商品")
            print("8.结算")
            print("9.退出")
            userin = input("请输入选项:")
            if userin == "1": #查看商品
                self.salse.showGoods()
            elif userin == "2": #购买商品
                self.show2()
            elif userin == "3": #查看购物车
                self.show3();
            elif userin == "4": #清空购物车
                 if self.shopp.closeShopping():
                     print("购物车已请空")
            elif userin=="5":
                self.salse.addgoods()
            elif userin == "8":
                self.shopp.gotoGoods()
                print("- "*50)
            elif userin == "9":
                break

    def show3(self):
        while 1:
            print("- " * 50)
            self.shopp.showShopping()
            print("- " * 50)
            print("1. 删除商品")
            print("2. 返回上一级")
            inp = input("请选择:")
            if inp == "1":
                id = int(input("请输入需要删除的物品id:"))
                num = int(input("请输入需要删除的物品数量(0表示全部删除):"))
                if self.shopp.defGoods(id,num):
                    print("删除成功")
                else:
                    print("删除失败")
            elif inp == "2":
                break

    def show2(self):
        """展示售卖商品"""
        print("- " * 50)
        print("**展示商品")
        self.salse.showGoods()
        print("**操作")
        id = int(input("请输入商品id:"))
        num = int(input("请输入购买数量:"))
        self.shopp.addGoods(id, num)

if __name__ == "__main__":
    #构建销售平台
    salse = Salse()
    #添加售卖商品
    salse.addgoods(Goods(1,"《Python从入门到精通》",50,20,"无","书"))
    salse.addgoods(Goods(2, "《Java从入门到精通》", 60, 20, "无", "书"))
    salse.addgoods(Goods(3, "《Android从入门到精通》", 40, 20, "无", "书"))
    salse.addgoods(Goods(4, "《C#从入门到精通》", 30, 10, "无", "书"))
    salse.addgoods(Goods(5, "《高等数学》", 80, 5, "无", "书"))
    #创建购物车
    shopp = ShoppingCat(salse)
    #初始化控制台
    con  = Console(salse,shopp)
    con.show1()      

继续阅读