2012-04-20 15 views
6

मेरी कक्षा विभिन्न प्रणालियों के राज्यों का प्रतिनिधित्व करती है। प्रत्येक उदाहरण में दो विशेषताएं होती हैं: एक एक ही कंटेनर एक ही सिस्टम के सभी राज्यों के बीच साझा किया जाता है, और दूसरा एक कंटेनर होता है जो प्रत्येक उदाहरण के लिए अद्वितीय होता है।कॉपी बनाम गहरी कॉपी: सेमेन्टिक्स

किसी राज्य की एक प्रति "साझा" विशेषता का पुन: उपयोग करना चाहिए, लेकिन "अद्वितीय" विशेषता की गहरी प्रति बनाएं। यह वास्तव में एकमात्र प्रति अर्थशास्त्र है जो समझ में आता है (यह स्वाभाविक है कि एक राज्य की प्रति एक ही प्रणाली की स्थिति है)।

मैं अपने कोड को पढ़ने और बनाए रखने वाले लोगों के लिए कम से कम आश्चर्य बनाना चाहता हूं। क्या मुझे अपने उद्देश्यों के लिए __deepcopy__ या __copy__ ओवरराइड करना चाहिए?

+0

'__deepcopy__' आप ले रहे हैं, तो एक चुनाव ... –

+0

खैर, मैं सर्वसम्मति से देखने की उम्मीद कर रहा था :) और यह तब भी हो सकता है जब हर किसी को हर किसी की प्रतिक्रिया देखने का मौका मिलता है। – max

उत्तर

3

क्या इस कक्षा के उदाहरणों की प्रतिलिपि बनाने के लिए कॉपी मॉड्यूल का उपयोग करना वास्तव में आवश्यक है? मैं तर्क दूंगा कि __copy__ या __deepcopy__ को ओवरराइड करने के बजाय आपको अपनी कक्षा के लिए copy विधि बनाना चाहिए जो आपके द्वारा परिभाषित कॉपी सेमेन्टिक्स का उपयोग करके एक नई वस्तु देता है।

यदि कुछ स्थिरता कारण के लिए आपको प्रतिलिपि मॉड्यूल का उपयोग करने की आवश्यकता है, तो मेरी राय में __deepcopy__ अधिक उपयुक्त है। यदि यह कक्षा का एक परिभाषित व्यवहार है कि सभी उदाहरण कंटेनरों में से एक साझा करते हैं, तो यह मानना ​​उचित है कि __deepcopy__ का कार्यान्वयन उस पर सम्मान करेगा।

+0

मैं 'कॉपी' मॉड्यूल का उपयोग न करने के साथ ठीक हूं। लेकिन अगर मैं 'प्रतिलिपि' विधि को परिभाषित करता हूं, तो क्या पाठकों को यह मानना ​​नहीं होगा कि यह एक उथली प्रतिलिपि है जैसे कि यह 'dict' या 'set' के लिए है? – max

+0

@max, क्या आपकी कक्षा 'dict' या 'set' का उप-वर्ग है? यदि नहीं, तो पाठकों को यह नहीं मानना ​​चाहिए कि आपकी कक्षा के लिए 'प्रतिलिपि' विधि को अंतर्निहित प्रकार से 'प्रतिलिपि' का अनुकरण करना चाहिए। –

+0

@ मैक्स: मुझे लगता है कि आप हमेशा कुछ पाठकों को आश्चर्यचकित करेंगे, क्योंकि आपके इच्छित अर्थशास्त्र न तो पूरी तरह से उथले हैं और न ही पूरी तरह से गहरे हैं। लेकिन कस्टम कॉपी सेमेन्टिक्स को परिभाषित करने के लिए सभी संभावित स्थानों में, मुझे लगता है कि एक वर्ग की 'प्रतिलिपि' विधि वह है जिसे अनुकूलित करने की संभावना है। अगर पूरी तरह से उथले और पूरी तरह से गहरी अर्थशास्त्र वास्तव में * आपकी कक्षा के लिए समझ में नहीं आता है, तो उन दोनों को ओवरराइड क्यों न करें? (आप '__copy__' के साथ-साथ' __deepcopy__' कक्षा की 'प्रतिलिपि' कॉल कर सकते हैं।) –

0

क्या यह आपकी स्थिति के समान है?

import copy 

class Foo(object): 
    shared = [[]] 
    def __init__(self): 
     self.perinstance = [[]] 

हां, तो ऐसा लगता है आप, __copy__ या __deepcopy__ परिभाषित करने की जरूरत नहीं है copy.deepcopy शेयरों वर्ग विशेषताओं के डिफ़ॉल्ट व्यवहार के बाद से और deepcopies तो उदाहरण के गुण:

x = Foo() 
z = copy.deepcopy(x) 
assert id(z.shared) == id(x.shared) 
assert id(z.shared[0]) == id(x.shared[0]) 
assert id(z.perinstance) != id(x.perinstance) 
assert id(z.perinstance[0]) != id(x.perinstance[0]) 
+0

दुर्भाग्यवश, मेरी साझा विशेषता एक उदाहरण विशेषता है। मैं अपने स्पष्टीकरण में अपरिचित था। उदाहरण के बीच "साझा" विशेषता भिन्न हो सकती है, लेकिन केवल तभी जब वे विभिन्न प्रणालियों से मेल खाते हों।कॉपी अर्थशास्त्र (जैसा कि आप उम्मीद करेंगे) एक ही सिस्टम से एक राज्य की एक प्रति बनाता है, इस प्रकार साझा साझा विशेषता का एक ही मूल्य है। मैं इसे स्पष्ट करने के लिए प्रश्न अद्यतन कर रहा हूं। – max