2010-01-28 14 views
26

मान लें कि हमारे पास k प्रकार class A है। हमने एक दूसरे class B(A) को परिभाषित किया। ऑब्जेक्ट k से class B पर "कन्वर्ट" करने का सबसे अच्छा अभ्यास क्या है और k में सभी डेटा को सुरक्षित रखें?पायथन ऑब्जेक्ट रूपांतरण

+2

आप किस तरह से एक से दूसरे में परिवर्तित करना चाहते हैं? क्या आप कक्षा बी ऑब्जेक्ट के सभी सदस्य चर रखना चाहते हैं, लेकिन पैरेंट क्लास ए के तरीकों के सेट का उपयोग करें? – BrainCore

+3

क्या यह सुंदर गरीब बहुरूपता है? एक आम superclass के ए और बी subclasses हैं? यदि हां, तो यह गलत बात है? क्या आप चाहते हैं कि बी के समान तरीके हों? यह एकाधिक विरासत के माध्यम से किया जाता है। कृपया बताएं कि आपको क्यों लगता है कि आपको इसकी आवश्यकता क्यों है क्योंकि - पायथन में - यदि आप सोचते हैं कि आपको कास्टिंग या टाइप रूपांतरण की आवश्यकता है तो आप इसे गलत कर रहे हैं। –

+0

आपके उपयोग के मामले के बारे में भी वास्तव में उत्सुक है। क्या यह सिर्फ मस्ती के लिए है, या क्या आपको क्लासिकल पॉलिमॉर्फिज्म की मदद से कुछ समस्या का समाधान करने का बेहतर तरीका मिल गया है? –

उत्तर

17

यह "वर्ग रूपांतरण" करता है, लेकिन यह संपार्श्विक क्षति के अधीन है। एक और ऑब्जेक्ट बनाना और __dict__ को बदलना क्योंकि ब्रेनकोर पोस्ट सुरक्षित होगा - लेकिन यह कोड जो आपने पूछा है, कोई नई वस्तु नहीं बनाई जा रही है।

class A(object): 
    pass 

class B(A): 
    def __add__(self, other): 
     return self.value + other 


a = A() 
a.value = 5 

a.__class__ = B 

print a + 10 
7
a = A() # parent class 
b = B() # subclass 
b.value = 3 # random setting of values 

a.__dict__ = b.__dict__ # give object a b's values 

# now proceed to use object a 

क्या यह आपके उपयोग के मामले को पूरा करेगा? नोट: केवल बी के आवृत्ति चर ऑब्जेक्ट ए से उपलब्ध नहीं होंगे, कक्षा बी के वर्ग चर नहीं। इसके अलावा, एक में संशोधित चर, ख में चर को संशोधित करेगा जब तक आप एक deepcopy कार्य करें:

import copy 
a.__dict__ = copy.deepcopy(b.__dict__) 
+1

असल में, कोई चर कॉपी नहीं किया जाएगा। चूंकि 'ए' और 'बी' अब दोनों' __dict__' साझा करते हैं, 'a.value'' b.value' को भी बदलते हैं। –

+0

आप सही, सही, धन्यवाद हैं। – BrainCore

+0

असल में ऐसा करने पर, "ए" वस्तु तुरंत नष्ट होनी चाहिए। अन्य एक ही गुणों को साझा करने वाले विभिन्न वर्गों में, दो अलग-अलग वस्तुओं के साथ समाप्त होता है - इससे कुछ खराब परिदृश्य हैं। (इंटरैक्टिव प्रॉम्प्ट पर भी खेलने के लिए डरावना है) – jsbueno

संबंधित मुद्दे