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ただし、オブジェクトについては、浅いコピーと深いコピーに分けられます.浅いコピーと深いコピーの違いは、メモリ領域を再申請したかどうか、コピーの対象がプロトタイプと独立しているかどうかを見ることです.深いコピーは、すべての値がプロトタイプと同じ独立したメモリ領域です.浅いコピーは、プロトタイプとメモリ領域を共有します.