天天看點

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()      

繼續閱讀