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)
def p_dict(self):
"""
python 中__dict__存储了该对象的一些属性
类和实例分别拥有自己的__dict__
在__init__中声明的变量,会存到实例的__dict__中
"""
for i in self.__dict__.items():
print(i)
def __str__(self):
mylist = []
ordered = OrderedDict(sorted(self.__dict__.items()))
for i in ordered.keys():
mylist.append("{}: {}".format(i, ordered[i]))
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)
if not found:
raise ValueError("incorrect object identifier: {}".format(identifier))
obj = copy.deepcopy(found)
print("-----",type(obj))
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'>
