工程实践之水果标语类设计

587 阅读14分钟

问题描述与方案设计

接到一个需求可以建模成下面这样:有一堆水果,有苹果、梨、火龙果等等。需要根据不同的水果来输出不同的标语。例如对苹果输出“xx苹果,好懂我的健康哦!”;对梨输出“不梨不弃”;对火龙果输出“风风火火都是我”。 但是苹果也有各种不同的子品种,如有红富士、红将军、金冠等等。对于红富士苹果,输出具体为“红富士苹果,好懂我的健康哦!”;对于金冠,输出具体为“金冠苹果,好懂我的健康哦!”。

现在指定在这些水果按照以下顺序排列:红富士苹果、红将军苹果、金冠苹果、梨、火龙果。 对应的标语为:

["红富士苹果,好懂我的健康哦!", "红将军苹果,好懂我的健康哦!", "金冠苹果,好懂我的健康哦!", "不梨不弃", "风风火火都是我"]

给定一个状态列表,指定对每个位置上的水果的标语的状态或参数。如

["红富士", "", "", True, False]

如果某个位置上是一个非空字符串(空字符串作为一个占位符),那么该字符作为该位置上对应水果的状态或者说一个参数。例如对于第0号位置,如果该位置上对应的是非空字符串,如这里的红富士,就用这个字符串替换苹果的标语中的xx,将标语修改为“红富士苹果,好懂我的健康哦!”;如果是空字符串就输出作为占位符的空字符串串。对3号位置上来说,如果为True就输出梨的标语“不梨不弃”,如果是False就输出空字符串。

那么最终输出一个列表:

["红富士苹果,好懂我的健康哦!", "", "", "不梨不弃", ""]

使用一个指定分隔符(如#)将这个列表拼接起来,输出为:

'红富士苹果,好懂我的健康哦!###不梨不弃#'

此外,在最终输出的字符串中可能还要加上一个引导语,如“有趣的水果标语们”,使用一个指定的分隔符(这里使用=>)分割引导语和水果的标语,于是这个字符串变成了:

'有趣的水果标语们=>红富士苹果,好懂我的健康哦!###不梨不弃#'

现在给定很多个这样的字符串,需要统计每类水果标语出现在所有数据中出现的总次数。苹果要按大类算,即不区分红富士、红将军和金冠,都算作苹果。

例如,如果多个字符串如下所示。

fruits = ['红富士苹果,好懂我的健康哦!###不梨不弃#', '#红将军苹果,好懂我的健康哦!##不梨不弃#我是这条街上最靓的水果', '##金冠苹果,好懂我的健康哦##风风火火都是我', '红富士苹果,好懂我的健康哦!#红将军苹果,好懂我的健康哦!##不梨不弃#']

那么统计结果也如下:

stat = {"苹果,好懂我的健康哦!": 4, "不梨不弃": 3, "风风火火都是我": 2}

那么如果要增加一个新的水果,例如,增加草莓,它的输出为“酸酸甜甜就是我”。那么排列顺序修改为: 红富士苹果、红将军苹果、金冠苹果、梨、火龙果、草莓。标语的列表变为

["红富士苹果,好懂我的健康哦!", "红将军苹果,好懂我的健康哦!", "金冠苹果,好懂我的健康哦!", "不梨不弃", "风风火火都是我", "酸酸甜甜就是我"]

现指定状态列表为:

["红富士", "红将军", "", True, False, True]

输出列表变为:

["红富士苹果,好懂我的健康哦!", "红将军苹果,好懂我的健康哦!", "", "不梨不弃", "", "酸酸甜甜就是我"]

最终输出的字符串变为:

"红富士苹果,好懂我的健康哦!#红将军苹果,好懂我的健康哦!##不梨不弃##酸酸甜甜就是我"

实现思路与代码

UML图如下。其中FruitSlogan为父类,表示水果标语,有一个子类AppleSlogan,该类与其父类的不同在于,它的get_slogan方法与父类的实在有些不同。

FruitSloganManager负责生成水果标语短句和反向解析水果标语短句并进行统计。有两个重要的方法,一个是create_slogan,这个方法根据状态列表生成水果标语短句;另一个是parse_slogan_and_statistic,反向解析水果标语短句并进行统计。

![image-20200725203320052](/Users/xixi2/Library/Application Support/typora-user-images/image-20200725203320052.png)

完整代码如下:

import re
import json


class FruitSlogan(object):
    def __init__(self, fruit, fruit_slogan, fruit_keyword, place_holder=""):
        self.fruit = fruit
        self.fruit_slogan = fruit_slogan
        self.fruit_keyword = fruit_keyword
        self.place_holder = place_holder

    def get_slogan(self, status_phrase):
        return self.fruit_slogan if status_phrase else self.place_holder

    def get_keyword(self):
        return self.fruit_keyword

    def is_status_valid(self, fruit_slogan):
        """
        :param fruit_slogan: 检查fruit_slogan是否有效
        :return:
        """
        return fruit_slogan != self.place_holder


class AppleSlogan(FruitSlogan):
    def __init__(self, fruit, fruit_slogan, fruit_keyword, place_holder=""):
        super().__init__(fruit, fruit_slogan, fruit_keyword, place_holder="")

    def get_slogan(self, sub_variety):
        fruit_slogan = "{}{}".format(sub_variety, self.fruit_slogan)
        return fruit_slogan if sub_variety else self.place_holder

    def get_keyword(self):
        return self.fruit_slogan


class FruitSloganManager:
    def __init__(self, place_holder="", start_delimiter="=>", delimiter="#"):
        self.fruit_list = [
            AppleSlogan("苹果", "苹果,好懂我的健康哦!", "苹果,好懂我的健康哦!"),
            AppleSlogan("苹果", "苹果,好懂我的健康哦!", "苹果,好懂我的健康哦!"),
            AppleSlogan("苹果", "苹果,好懂我的健康哦!", "苹果,好懂我的健康哦!"),
            FruitSlogan("梨", "不梨不弃", "不梨不弃"),
            FruitSlogan("火龙果", "风风火火都是我", "风风火火都是我")
        ]
        self.statistic_map = {fruit.get_keyword(): 0 for fruit in self.fruit_list}
        self.place_holder = place_holder
        self.start_delimiter = start_delimiter
        self.delimiter = delimiter
        self.total_cnt = 0

    def reset(self):
        self.total_cnt = 0

    def add_total2statistic_data(self, key="水果标语总计"):
        """
        :param key: 总和对应的key
        :param total_cnt: 统计总和
        :return:
        """
        self.statistic_map[key] = self.total_cnt

    def add_guide_header(self, guide_msg, slogan_content):
        return "{}{}{}".format(guide_msg, self.start_delimiter, slogan_content)

    def create_slogan(self, status_list, guide_msg="有趣的水果标语们"):
        self.total_cnt += 1
        content_list = []
        for i in range(len(status_list)):
            chk = self.fruit_list[i]
            msg = chk.get_slogan(status_list[i])
            content_list.append(msg)

        slogan_content = self.delimiter.join(content_list)
        if guide_msg:
            slogan_content = self.add_guide_header(guide_msg, slogan_content)
        return slogan_content

    def parse_slogan_and_statistic(self, slogan):
        pattern = "{}".format(re.escape(self.delimiter))

        start_index = slogan.find(self.start_delimiter)
        if start_index != -1:  # 如果slogan中包含引导语,则将引导语去掉
            slogan = slogan[start_index + len(self.start_delimiter):]
        slogan_list = re.split(pattern, slogan)

        for i, slogan in enumerate(slogan_list):
            checker = self.fruit_list[i]
            if checker.is_status_valid(slogan):  # 如果check_valid返回True说明这个检查项正确,不需要统计到错误原因中
                keyword = checker.get_keyword()
                self.statistic_map[keyword] += 1

    def slogan_statistic(self, slogans, need_total=True):
        for slogan in slogans:
            self.parse_slogan_and_statistic(slogan)
        if need_total:
            self.add_total2statistic_data()

        self.reset()  # 复位总计值,为下次任务做准备

    def dispaly(self):
        print(list(self.statistic_map.keys()))
        print(json.dumps(self.statistic_map, ensure_ascii=False, indent=2))


def do_task1():
    status_lists = [
        ["红富士", "", "", True, False],
        ["", "红将军", "", False, False],
        ["", "红将军", "", False, True],
        ["红富士", "", "金冠", True, False],
    ]
    mgr = FruitSloganManager()

    print("对象唯一标识:", id(mgr))  # 返回对象的唯一标识符
    print('-' * 30, '产生的标语如下', '-' * 30)
    slogans = []
    for status_list in status_lists:
        slogan_content = mgr.create_slogan(status_list)
        print(slogan_content)
        slogans.append(slogan_content)

    print('-' * 30, '统计结果如下', '-' * 30)
    mgr.slogan_statistic(slogans)
    mgr.dispaly()


def do_task2():
    status_lists = [
        ["红富士", "", "", True, True],
        ["红富士", "红将军", "", False, False],
        ["", "红将军", "金冠", False, True],
        ["", "", "金冠", True, False],
        ["红富士", "", "金冠", False, False],
    ]
    mgr = FruitSloganManager()

    print("对象唯一标识:", id(mgr))  # 返回对象的唯一标识符
    print('-' * 30, '产生的标语如下', '-' * 30)
    slogans = []
    for status_list in status_lists:
        slogan_content = mgr.create_slogan(status_list)
        print(slogan_content)
        slogans.append(slogan_content)

    print('-' * 30, '统计结果如下', '-' * 30)
    mgr.slogan_statistic(slogans)
    mgr.dispaly()


if __name__ == "__main__":
    do_task1()
    print()
    do_task2()

运行结果

对象唯一标识: 4631980112
------------------------------ 产生的标语如下 ------------------------------
有趣的水果标语们=>红富士苹果,好懂我的健康哦!###不梨不弃#
有趣的水果标语们=>#红将军苹果,好懂我的健康哦!###
有趣的水果标语们=>#红将军苹果,好懂我的健康哦!###风风火火都是我
有趣的水果标语们=>红富士苹果,好懂我的健康哦!##金冠苹果,好懂我的健康哦!#不梨不弃#
------------------------------ 统计结果如下 ------------------------------
['苹果,好懂我的健康哦!', '不梨不弃', '风风火火都是我', '水果标语总计']
{
  "苹果,好懂我的健康哦!": 5,
  "不梨不弃": 2,
  "风风火火都是我": 1,
  "水果标语总计": 4
}

对象唯一标识: 4631980112
------------------------------ 产生的标语如下 ------------------------------
有趣的水果标语们=>红富士苹果,好懂我的健康哦!###不梨不弃#风风火火都是我
有趣的水果标语们=>红富士苹果,好懂我的健康哦!#红将军苹果,好懂我的健康哦!###
有趣的水果标语们=>#红将军苹果,好懂我的健康哦!#金冠苹果,好懂我的健康哦!##风风火火都是我
有趣的水果标语们=>##金冠苹果,好懂我的健康哦!#不梨不弃#
有趣的水果标语们=>红富士苹果,好懂我的健康哦!##金冠苹果,好懂我的健康哦!##
------------------------------ 统计结果如下 ------------------------------
['苹果,好懂我的健康哦!', '不梨不弃', '风风火火都是我', '水果标语总计']
{
  "苹果,好懂我的健康哦!": 8,
  "不梨不弃": 2,
  "风风火火都是我": 2,
  "水果标语总计": 5
}

加上单例模式

为什么要加上单例模式呢?因为在我的程序中,需要周期性地去完成这样一个统计,所以,如果不将FruitSloganManager变成一个单例,那么就会不停地创建多个FruitSloganManager类的对象,内存开销大。

import re
import json
import threading


class Singleton(type):
    _instance_lock = threading.Lock()

    def __call__(cls, *args, **kwargs):
        if not hasattr(cls, "_instance"):
            with Singleton._instance_lock:
                if not hasattr(cls, "_instance"):
                    cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instance


class FruitSlogan(object):
    def __init__(self, fruit, fruit_slogan, fruit_keyword, place_holder=""):
        self.fruit = fruit
        self.fruit_slogan = fruit_slogan
        self.fruit_keyword = fruit_keyword
        self.place_holder = place_holder

    def get_slogan(self, status_phrase):
        return self.fruit_slogan if status_phrase else self.place_holder

    def get_keyword(self):
        return self.fruit_keyword

    def is_status_valid(self, fruit_slogan):
        """
        :param fruit_slogan: 检查fruit_slogan是否有效
        :return:
        """
        return fruit_slogan != self.place_holder


class AppleSlogan(FruitSlogan):
    def __init__(self, fruit, fruit_slogan, fruit_keyword, place_holder=""):
        super().__init__(fruit, fruit_slogan, fruit_keyword, place_holder="")

    def get_slogan(self, sub_variety):
        fruit_slogan = "{}{}".format(sub_variety, self.fruit_slogan)
        return fruit_slogan if sub_variety else self.place_holder

    def get_keyword(self):
        return self.fruit_slogan


class FruitSloganManager(object, metaclass=Singleton):
    def __init__(self, place_holder="", start_delimiter="=>", delimiter="#"):
        self.fruit_list = [
            AppleSlogan("苹果", "苹果,好懂我的健康哦!", "苹果,好懂我的健康哦!"),
            AppleSlogan("苹果", "苹果,好懂我的健康哦!", "苹果,好懂我的健康哦!"),
            AppleSlogan("苹果", "苹果,好懂我的健康哦!", "苹果,好懂我的健康哦!"),
            FruitSlogan("梨", "不梨不弃", "不梨不弃"),
            FruitSlogan("火龙果", "风风火火都是我", "风风火火都是我")
        ]
        self.place_holder = place_holder
        self.start_delimiter = start_delimiter
        self.delimiter = delimiter
        self.reset()

    def reset(self):
        # 复位总计值,为下次任务做准备
        self.total_cnt = 0
        self.statistic_map = {fruit.get_keyword(): 0 for fruit in self.fruit_list}

    def add_total2statistic_data(self, key="水果标语总计"):
        """
        :param key: 总和对应的key
        :param total_cnt: 统计总和
        :return:
        """
        self.statistic_map[key] = self.total_cnt

    def add_guide_header(self, guide_msg, slogan_content):
        return "{}{}{}".format(guide_msg, self.start_delimiter, slogan_content)

    def create_slogan(self, status_list, guide_msg="有趣的水果标语们"):
        self.total_cnt += 1
        content_list = []
        for i in range(len(status_list)):
            chk = self.fruit_list[i]
            msg = chk.get_slogan(status_list[i])
            content_list.append(msg)

        slogan_content = self.delimiter.join(content_list)
        if guide_msg:
            slogan_content = self.add_guide_header(guide_msg, slogan_content)
        return slogan_content

    def parse_slogan_and_statistic(self, slogan):
        pattern = "{}".format(re.escape(self.delimiter))

        start_index = slogan.find(self.start_delimiter)
        if start_index != -1:  # 如果slogan中包含引导语,则将引导语去掉
            slogan = slogan[start_index + len(self.start_delimiter):]
        slogan_list = re.split(pattern, slogan)

        for i, slogan in enumerate(slogan_list):
            checker = self.fruit_list[i]
            if checker.is_status_valid(slogan):  # 如果check_valid返回True说明这个检查项正确,不需要统计到错误原因中
                keyword = checker.get_keyword()
                self.statistic_map[keyword] += 1

    def slogan_statistic(self, slogans, need_total=True):
        for slogan in slogans:
            self.parse_slogan_and_statistic(slogan)
        if need_total:
            self.add_total2statistic_data()

        self.reset()  # 复位总计值,为下次任务做准备

    def dispaly(self):
        print(list(self.statistic_map.keys()))
        print(json.dumps(self.statistic_map, ensure_ascii=False, indent=2))


def do_task1():
    status_lists = [
        ["红富士", "", "", True, False],
        ["", "红将军", "", False, False],
        ["", "红将军", "", False, True],
        ["红富士", "", "金冠", True, False],
    ]
    mgr = FruitSloganManager()

    print("对象唯一标识:", id(mgr))  # 返回对象的唯一标识符
    print('-' * 30, '产生的标语如下', '-' * 30)
    slogans = []
    for status_list in status_lists:
        slogan_content = mgr.create_slogan(status_list)
        print(slogan_content)
        slogans.append(slogan_content)

    print('-' * 30, '统计结果如下', '-' * 30)
    mgr.slogan_statistic(slogans)
    mgr.dispaly()
    mgr.reset()


def do_task2():
    status_lists = [
        ["红富士", "", "", True, True],
        ["红富士", "红将军", "", False, False],
        ["", "红将军", "金冠", False, True],
        ["", "", "金冠", True, False],
        ["红富士", "", "金冠", False, False],
    ]
    mgr = FruitSloganManager()

    print("对象唯一标识:", id(mgr))  # 返回对象的唯一标识符
    print('-' * 30, '产生的标语如下', '-' * 30)
    slogans = []
    for status_list in status_lists:
        slogan_content = mgr.create_slogan(status_list)
        print(slogan_content)
        slogans.append(slogan_content)

    print('-' * 30, '统计结果如下', '-' * 30)
    mgr.slogan_statistic(slogans)
    mgr.dispaly()
    mgr.reset()


if __name__ == "__main__":
    do_task1()
    print()
    do_task2()

运行结果

对象唯一标识: 4472374224
------------------------------ 产生的标语如下 ------------------------------
有趣的水果标语们=>红富士苹果,好懂我的健康哦!###不梨不弃#
有趣的水果标语们=>#红将军苹果,好懂我的健康哦!###
有趣的水果标语们=>#红将军苹果,好懂我的健康哦!###风风火火都是我
有趣的水果标语们=>红富士苹果,好懂我的健康哦!##金冠苹果,好懂我的健康哦!#不梨不弃#
------------------------------ 统计结果如下 ------------------------------
['苹果,好懂我的健康哦!', '不梨不弃', '风风火火都是我', '水果标语总计']
{
  "苹果,好懂我的健康哦!": 5,
  "不梨不弃": 2,
  "风风火火都是我": 1,
  "水果标语总计": 4
}

对象唯一标识: 4472300496
------------------------------ 产生的标语如下 ------------------------------
有趣的水果标语们=>红富士苹果,好懂我的健康哦!###不梨不弃#风风火火都是我
有趣的水果标语们=>红富士苹果,好懂我的健康哦!#红将军苹果,好懂我的健康哦!###
有趣的水果标语们=>#红将军苹果,好懂我的健康哦!#金冠苹果,好懂我的健康哦!##风风火火都是我
有趣的水果标语们=>##金冠苹果,好懂我的健康哦!#不梨不弃#
有趣的水果标语们=>红富士苹果,好懂我的健康哦!##金冠苹果,好懂我的健康哦!##
------------------------------ 统计结果如下 ------------------------------
['苹果,好懂我的健康哦!', '不梨不弃', '风风火火都是我', '水果标语总计']
{
  "苹果,好懂我的健康哦!": 8,
  "不梨不弃": 2,
  "风风火火都是我": 2,
  "水果标语总计": 5
}

添加新的水果

添加新的水果时,只需要添加一个新的水果对应的FruitSlogan类对象,并在状态列表中添加上,每一个slogan短句该水果标语对应的状态。

在添加新的水果时,不需要改动代码,而只需添加代码,符合设计模式中的开闭原则,只需添加新的代码就可以完成功能。

import re
import json
import threading


class Singleton(type):
    _instance_lock = threading.Lock()

    def __call__(cls, *args, **kwargs):
        if not hasattr(cls, "_instance"):
            with Singleton._instance_lock:
                if not hasattr(cls, "_instance"):
                    cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instance


class FruitSlogan(object):
    def __init__(self, fruit, fruit_slogan, fruit_keyword, place_holder=""):
        self.fruit = fruit
        self.fruit_slogan = fruit_slogan
        self.fruit_keyword = fruit_keyword
        self.place_holder = place_holder

    def get_slogan(self, status_phrase):
        return self.fruit_slogan if status_phrase else self.place_holder

    def get_keyword(self):
        return self.fruit_keyword

    def is_status_valid(self, fruit_slogan):
        """
        :param fruit_slogan: 检查fruit_slogan是否有效
        :return:
        """
        return fruit_slogan != self.place_holder


class AppleSlogan(FruitSlogan):
    def __init__(self, fruit, fruit_slogan, fruit_keyword, place_holder=""):
        super().__init__(fruit, fruit_slogan, fruit_keyword, place_holder="")

    def get_slogan(self, sub_variety):
        fruit_slogan = "{}{}".format(sub_variety, self.fruit_slogan)
        return fruit_slogan if sub_variety else self.place_holder

    def get_keyword(self):
        return self.fruit_slogan


class FruitSloganManager(object, metaclass=Singleton):
    def __init__(self, place_holder="", start_delimiter="=>", delimiter="#"):
        self.fruit_list = [
            AppleSlogan("苹果", "苹果,好懂我的健康哦!", "苹果,好懂我的健康哦!"),
            AppleSlogan("苹果", "苹果,好懂我的健康哦!", "苹果,好懂我的健康哦!"),
            AppleSlogan("苹果", "苹果,好懂我的健康哦!", "苹果,好懂我的健康哦!"),
            FruitSlogan("梨", "不梨不弃", "不梨不弃"),
            FruitSlogan("火龙果", "风风火火都是我", "风风火火都是我"),
            FruitSlogan("香蕉", "智慧之果", "智慧之果")
        ]
        self.place_holder = place_holder
        self.start_delimiter = start_delimiter
        self.delimiter = delimiter
        self.reset()

    def reset(self):
        # 复位总计值,为下次任务做准备
        self.total_cnt = 0
        self.statistic_map = {fruit.get_keyword(): 0 for fruit in self.fruit_list}

    def add_total2statistic_data(self, key="水果标语总计"):
        """
        :param key: 总和对应的key
        :param total_cnt: 统计总和
        :return:
        """
        self.statistic_map[key] = self.total_cnt

    def add_guide_header(self, guide_msg, slogan_content):
        return "{}{}{}".format(guide_msg, self.start_delimiter, slogan_content)

    def create_slogan(self, status_list, guide_msg="有趣的水果标语们"):
        self.total_cnt += 1
        content_list = []
        for i in range(len(status_list)):
            chk = self.fruit_list[i]
            msg = chk.get_slogan(status_list[i])
            content_list.append(msg)

        slogan_content = self.delimiter.join(content_list)
        if guide_msg:
            slogan_content = self.add_guide_header(guide_msg, slogan_content)
        return slogan_content

    def parse_slogan_and_statistic(self, slogan):
        pattern = "{}".format(re.escape(self.delimiter))

        start_index = slogan.find(self.start_delimiter)
        if start_index != -1:  # 如果slogan中包含引导语,则将引导语去掉
            slogan = slogan[start_index + len(self.start_delimiter):]
        slogan_list = re.split(pattern, slogan)

        for i, slogan in enumerate(slogan_list):
            checker = self.fruit_list[i]
            if checker.is_status_valid(slogan):  # 如果check_valid返回True说明这个检查项正确,不需要统计到错误原因中
                keyword = checker.get_keyword()
                self.statistic_map[keyword] += 1

    def slogan_statistic(self, slogans, need_total=True):
        for slogan in slogans:
            self.parse_slogan_and_statistic(slogan)
        if need_total:
            self.add_total2statistic_data()

    def dispaly(self):
        print(list(self.statistic_map.keys()))
        print(json.dumps(self.statistic_map, ensure_ascii=False, indent=2))


def do_task1():
    status_lists = [
        ["红富士", "", "", True, False, False],
        ["", "红将军", "", False, False, True],
        ["", "红将军", "", False, True, True],
        ["红富士", "", "金冠", True, False, True],
    ]
    mgr = FruitSloganManager()

    print("对象唯一标识:", id(mgr))  # 返回对象的唯一标识符
    print('-' * 30, '产生的标语如下', '-' * 30)
    slogans = []
    for status_list in status_lists:
        slogan_content = mgr.create_slogan(status_list)
        print(slogan_content)
        slogans.append(slogan_content)

    print('-' * 30, '统计结果如下', '-' * 30)
    mgr.slogan_statistic(slogans)
    mgr.dispaly()
    mgr.reset()


def do_task2():
    status_lists = [
        ["红富士", "", "", True, True, False],
        ["红富士", "红将军", "", False, False, True],
        ["", "红将军", "金冠", False, True, False],
        ["", "", "金冠", True, False, False],
        ["红富士", "", "金冠", False, False, True],
    ]
    mgr = FruitSloganManager()

    print("对象唯一标识:", id(mgr))  # 返回对象的唯一标识符
    print('-' * 30, '产生的标语如下', '-' * 30)
    slogans = []
    for status_list in status_lists:
        slogan_content = mgr.create_slogan(status_list)
        print(slogan_content)
        slogans.append(slogan_content)

    print('-' * 30, '统计结果如下', '-' * 30)
    mgr.slogan_statistic(slogans)
    mgr.dispaly()
    mgr.reset()


if __name__ == "__main__":
    do_task1()
    print()
    do_task2()

运行结果

对象唯一标识: 4680378448
------------------------------ 产生的标语如下 ------------------------------
有趣的水果标语们=>红富士苹果,好懂我的健康哦!###不梨不弃##
有趣的水果标语们=>#红将军苹果,好懂我的健康哦!####智慧之果
有趣的水果标语们=>#红将军苹果,好懂我的健康哦!###风风火火都是我#智慧之果
有趣的水果标语们=>红富士苹果,好懂我的健康哦!##金冠苹果,好懂我的健康哦!#不梨不弃##智慧之果
------------------------------ 统计结果如下 ------------------------------
['苹果,好懂我的健康哦!', '不梨不弃', '风风火火都是我', '智慧之果', '水果标语总计']
{
  "苹果,好懂我的健康哦!": 5,
  "不梨不弃": 2,
  "风风火火都是我": 1,
  "智慧之果": 3,
  "水果标语总计": 4
}

对象唯一标识: 4680378448
------------------------------ 产生的标语如下 ------------------------------
有趣的水果标语们=>红富士苹果,好懂我的健康哦!###不梨不弃#风风火火都是我#
有趣的水果标语们=>红富士苹果,好懂我的健康哦!#红将军苹果,好懂我的健康哦!####智慧之果
有趣的水果标语们=>#红将军苹果,好懂我的健康哦!#金冠苹果,好懂我的健康哦!##风风火火都是我#
有趣的水果标语们=>##金冠苹果,好懂我的健康哦!#不梨不弃##
有趣的水果标语们=>红富士苹果,好懂我的健康哦!##金冠苹果,好懂我的健康哦!###智慧之果
------------------------------ 统计结果如下 ------------------------------
['苹果,好懂我的健康哦!', '不梨不弃', '风风火火都是我', '智慧之果', '水果标语总计']
{
  "苹果,好懂我的健康哦!": 8,
  "不梨不弃": 2,
  "风风火火都是我": 2,
  "智慧之果": 2,
  "水果标语总计": 5
}