python面向对象-类与类的关系2

关联关系

A类会用到B类,这是一种强依赖关系,是长期的并非偶然。
代码:A类的成员变量中含有B类。

UML类图

A类用到B类,实线箭头从A类指向B类

聚合关系

聚合是关联关系的一种特例,是整体和部分的关系

  1. 代表了has-a的关系
  2. 整体和部分之间是可分离的,部分可以属于多个整体
  3. 整体和部分拥有各自的生命周期。整体存在与否不会相互影响部分,反之亦然

代码体现:
作为整体的A类,有序列类型的属性,用于保存部分。

学校类和学生类、公司类和员工类等,就属于聚合关系。

案例

在电商项目中,购物车和商品的关系,就是聚合关系

我们将要实现购商品类Goods和物车类Cart

UML类图:
http://www.malaoshi.top/upload/0/0/1EF2GGxK99Qi.png

使用空心菱形+实线箭头表示,空心菱形边指向类Cart(整体),实现箭头边指向部分类Goods(部分)

Cart类属性说明:

  1. _goods_dict:dict类型,key是商品编号,value是dict类型的序列,该序列中,key是”goods”,value是goods对象,key是”num”,value是数量
  2. _total_num:int类型,购物车里商品的总共数量
  3. _total_price:float类型,总共价格

Cart类方法说明:

  1. add_goods():添加一个商品。如果是增加购物车中已有的商品,就将商品对应的数量加1;如果是增加购物车中没有的商品,就将商品添加到_goods_dict属性中,且数量是1。同时将_goods_num加1,并将_total_price加上该商品的价格
  2. remove_goods():移除一个商品。如果是移除购物车中已有的商品,当商品数量为1时,就将该商品从_goods_dict属性中删除,当商品数量大于1时,就将商品对应的数量减1;如果移除购物车中没有的商品时,不做操作。同时将_goods_num减1,并将_total_price减去该商品的价格
  3. get_total_price():返回_total_price属性
  4. get_total_num():返回_total_num属性
  5. get_goods():返回_goods_dict属性
  6. _has_goods():判断该商品是否存在在购物车中。用商品的编号进行判断,不能通过商品名判断,因为同一个名字的商品,可以由不同的店铺售卖。而商品编号是唯一的。

代码如下:
商品类:

class Goods:
    def __init__(self,id,name,price):
        #商品编号
        self._id=id
        self._name=name
        self._price=price

    def get_id(self):
        return self._id

    def get_name(self):
        return self._name

    def get_price(self):
        return self._price

购物车类:

#购物车类
class Cart:

    def __init__(self):
        #key是商品编号,value是dict类型的序列,其中key是goods,value是goods对象,key是num,value是数量
        self._goods_dict={}
        #购物车中总共的数量
        self._total_num=0
        self._total_price=0

    def add_goods(self,goods):
        b=self._has_goods(goods)
        id=goods.get_id()
        if b:
            goods_num_dict=self._goods_dict[id]
            num=goods_num_dict['num']
            goods_num_dict['num']=num+1
        else:
            self._goods_dict[id]={"goods":goods,"num":1}

        self._total_num+=1
        self._total_price+=goods.get_price()

    #伪私有方法,判断商品是否存在
    def _has_goods(self,goods):
        if goods.get_id() in self._goods_dict.keys():
            return True
        else:
            return False

    def remove_goods(self,goods):
        b=self._has_goods(goods)
        id=goods.get_id()
        #如果存在
        if b:
            goods_num_dict=self._goods_dict[id]
            num=goods_num_dict['num']
            #判断数量是1,就移除
            if num==1:
                del self._goods_dict[id]
            else:
                goods_num_dict['num']=num-1

            self._total_num-=1
            self._total_price-=goods.get_price()

    def get_total_price(self):
        return self._total_price

    def get_total_num(self):
        return self._total_num

    def get_goods(self):
        return self._goods_dict

调用:

def print_info():
    print("购物车数量:%d,品类:%d,数量:%d,总价:%d,商品:"%(cart.get_total_num(),len(cart.get_goods()),cart.get_total_num(),cart.get_total_price()),end="")

    for key,value in cart.get_goods().items():
        print("{%s:{num:%s,goods:<id:%s,name:%s,price:%d>}}"%(key,value['num'],value["goods"].get_id(),value["goods"].get_name(),value["goods"].get_price()),end=",")

    print()

cdb=Goods("001","小米充电宝",100)
dnb=Goods("002","小米电脑包",120)
dnb2=Goods("002","小米电脑包",120)
dnb3=Goods("003","小米电脑包",120)

cart=Cart()
cart.add_goods(cdb)
print_info()
cart.add_goods(dnb)
print_info()
cart.add_goods(dnb2)
print_info()
cart.add_goods(dnb3)
print_info()
cart.remove_goods(dnb2)
print_info()
cart.remove_goods(dnb2)
print_info()

原文出处:/show_1EF2Fzgxzw4E.html