文章目錄
- 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()