Pythonプロトタイプモード
# -*- coding: utf-8 -*-
"""
Created on Wed Mar 28 19:41:57 2018
@author: mz
"""
from copy import copy, deepcopy
class Prototype(object):
def Clone(self):
pass
def DeepClone(self):
pass
class Year(object):
@property
def year(self):
return self._year
@year.setter
def year(self, y):
if isinstance(y, int):
self._year = y
return
if isinstance(y, str) and y.isdigit():
y = int(y)
self._year = y
else:
raise ValueError("year is illegal")
@year.deleter
def year(self):
del self._year
class Resume(Prototype):
def __init__(self, name):
self.name = name
self.workingYear = 3
self._year = Year()
self._year.year = 3
def SetWorkingYear(self, y):
self.workingYear = y
self._year.year = y
def Clone(self):
return copy(self)
def DeepClone(self):
return deepcopy(self)
def Show(self):
print(self.name, self.workingYear, self._year.year)
if "__main__" == __name__:
resume = Resume("zhang san")
resume.Show()
a = resume.Clone()
b = resume.DeepClone()
print("\r
---resume 10---")
resume.SetWorkingYear(10)
resume.Show()
a.Show()
b.Show()
print("\r
---clone a 8---")
a.SetWorkingYear(8)
resume.Show()
a.Show()
b.Show()
print("\r
---deep clone b 6---")
b.SetWorkingYear(6)
resume.Show()
a.Show()
b.Show()
実行結果:
zhang san 3 3
---resume 10---
zhang san 10 10
zhang san 3 10
zhang san 3 3
---clone a 8---
zhang san 10 8
zhang san 8 8
zhang san 3 3
---deep clone b 6---
zhang san 10 8
zhang san 8 8
zhang san 6 6
プロトタイプモードは、テンプレートに基づいて、自身を再コピーする.1値のコピーには影響しません.
2ただし、オブジェクトについては、浅いコピーと深いコピーに分けられます.浅いコピーと深いコピーの違いは、メモリ領域を再申請したかどうか、コピーの対象がプロトタイプと独立しているかどうかを見ることです.深いコピーは、すべての値がプロトタイプと同じ独立したメモリ領域です.浅いコピーは、プロトタイプとメモリ領域を共有します.