python设计模式---->原型模式 自己的一点理解,和对旧知识的复习

本文探讨了Python设计模式中的原型模式,分享了个人对其理解,并通过实例代码展示了如何使用原型模式进行对象复制,旨在帮助读者复习和巩固设计模式知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import copy
from collections import OrderedDict


class Book():

    def __init__(self, name, auther, price, **kwargs):

        self.name = name
        self.auther = auther
        self.price = price

        self.__dict__.update(kwargs) # update 方法将数据添加到self.__dict__中

    def p_dict(self):
        """
        python 中__dict__存储了该对象的一些属性

        类和实例分别拥有自己的__dict__

        在__init__中声明的变量,会存到实例的__dict__中
        """
        for i in self.__dict__.items():
            print(i)

    def __str__(self):
        # __str__ 魔法方法 实例化一个对象后,打印这个对象,那么打印的内容就是这个魔法方法的return的数据,所以也可以用来给对象传递数据
        mylist = []
        # 使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。
        #
        # 如果要保持Key的顺序,可以用OrderedDict
        # 注意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序
        ordered = OrderedDict(sorted(self.__dict__.items()))
        for i in ordered.keys():
            mylist.append("{}: {}".format(i, ordered[i]))
            # 遍历实例的 __dict__ ,取得key和value 然后把他们添加到mylist列表中
            if i == "price":
                mylist.append("$")
            mylist.append("\n")

        return "".join(mylist)


class Prototype():
    def __init__(self):
        self.objects = dict()

    def register(self,identifier, obj):
        # 将接收到的数据存到字典中 也就是保存原版数据
        self.objects[identifier] = obj



    def unregister(self,identifier):
        # 删除数据

        del self.objects[identifier]

    def clone(self, identifier, **kwargs):
        # 克隆

        found = self.objects.get(identifier)
        # 根据key获取原版数据

        if not found:
            raise ValueError("incorrect object identifier: {}".format(identifier))
            # 如果原版数据没有,那么报错

        obj = copy.deepcopy(found)
        # 深拷贝原版数据
        print("-----",type(obj)) # ----- <class '__main__.Book'> 为什么数据类型是__main__.Book 这边虽然说是从字典中取到的obj
        # 但是type是看obj的类型,而不是看self.objects的类型
        obj.__dict__.update(kwargs)

        return obj


def main():
    b1 = Book("三国演义",("罗贯中", "李国文"), price=118,
              publisher="中信出版", publication_date="1978-02-22", tags= ("统一", "智谋","兄弟情谊", "人物事迹"))

    b1.p_dict()

    prototype = Prototype()
    cid = "k&r-first" # 标识符
    prototype.register(cid, b1)
    b2 = prototype.clone(cid, name="the Programming Language(AUSI)",price=48.99,
                         length=274, publication_date="1988-04-01",edition=2)



    for i in (b1, b2):
        print(i)
    print("ID b1: {} != ID b2 : {}".format(id(b1),id(b2)))


if __name__ == '__main__':
    main()


"""
原型设计模式,用于创建对象的完全副本。确切的说,创建一个对象的副本可以指代以下两件事,
当创建一个浅副本时,副本依赖引用
当创建一个深副本时,副本复制所有东西
当前这个程序用来创建一个书本二次出版的程序,这个是一个深拷贝的原型设计模式
首先我们先将书本的原版书籍写好
然后出版
然后第二次出版的时候在原版的数据上进行改变,然后在出版
原型设计模式(深拷贝副本)意味着我们在原来的数据上可以修改,添加,删除数据,而不影响原来的数据
"""


print("-----",type(obj))

    # 那位大佬解释下这个 谢谢为啥type打印出来的不是数据类型而是 <class '__main__.Book'>

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值