2009-11-25 11 views
8

ऐसा लगता है अजगर उदाहरण के तरीकों के बारे में कुछ सीमाएँ हैं कि।उदाहरण के तरीकों के बारे में पर काबू पाने अजगर सीमाओं

  1. इंस्टेंस विधियों की प्रतिलिपि नहीं बनाई जा सकती है।
  2. उदाहरण तरीकों मसालेदार नहीं किया जा सकता।

यह मेरे लिए समस्याग्रस्त है, क्योंकि मैं पर काम एक बहुत ही वस्तु उन्मुख project जिसमें मैं उदाहरण के तरीकों का संदर्भ है, और वहाँ दोनों deepcopying और अचार बनाने का फायदा नहीं है। मसालेदार चीज ज्यादातर मल्टीप्रोसेसिंग तंत्र द्वारा की जाती है।

क्या इस को हल करने के लिए एक अच्छा तरीका हो सकता है? मैं नकल मुद्दे पर कुछ बदसूरत वैकल्पिक हल किया था, लेकिन मैं दोनों समस्याओं के लिए एक अच्छा समाधान के लिए देख रहा हूँ।

क्या किसी के पास कोई सुझाव है?

अद्यतन:

मेरे उपयोग के मामले: मैं एक छोटे से घटना प्रणाली है। प्रत्येक ईवेंट में .action विशेषता होती है जो उस फ़ंक्शन को इंगित करती है जिसे ट्रिगर करना होता है, और कभी-कभी वह फ़ंक्शन कुछ ऑब्जेक्ट का एक उदाहरण विधि है।

+5

आमतौर पर, हम उन सभी स्थानों पर कोड प्रदान करते हैं जिनमें हम काम कर रहे हैं और केवल राज्य के प्रतिनिधित्व को स्थानांतरित करते हैं। प्रतिनिधित्व राज्य स्थानांतरण अधिक आम और सरल है। इसमें गलत क्या है? –

+0

एसएलॉट, आपको स्पष्ट रूप से इस मुद्दे के साथ और अधिक अनुभव है, लेकिन कृपया मुझे एक अधिक बेवकूफ तरीके से समझाएं, आप वास्तव में क्या सुझाव दे रहे हैं, यह कैसे संबंधित है, "प्रतिनिधित्व राज्य स्थानांतरण" आदि क्या है –

+0

आप कह रहे हैं "मैं उदाहरण विधियों को चुनना चाहता हूं", लेकिन आप यह नहीं कह रहे हैं क्यों। यह हमें यह जानने में मदद करेगा कि आप किस समस्या को हल करने की कोशिश कर रहे हैं, क्योंकि ऐसा करने के लिए एक और पाइथोनिक तरीका हो सकता है। ऐसा लगता है कि आप रूबी में सोच रहे हैं ... –

उत्तर

15

आप copy_reg.pickle का उपयोग करके ऐसा करने में सक्षम हो सकते हैं। पायथन 2 में।6:

import copy_reg 
import types 

def reduce_method(m): 
    return (getattr, (m.__self__, m.__func__.__name__)) 

copy_reg.pickle(types.MethodType, reduce_method) 

यह कोड विधि के, बस इसके नाम की दुकान नहीं है; लेकिन यह सामान्य मामले में सही ढंग से काम करेगा।

इससे दोनों पिकलिंग और प्रतिलिपि बनाते हैं!

+0

अच्छा विचार, मुझे लगता है कि यह सबसे साफ समाधान हो सकता है। क्या आपको दूसरी समस्या के लिए कोई विचार है, कॉपी करना? साथ ही, क्या किसी ने पहले से ही 'copy_reg' समाधान लागू किया है जिसका उपयोग मैं कर सकता हूं? –

+0

मैंने जवाब संपादित किया और कुछ कोड जोड़ा। –

3

बाकी - प्रतिनिधित्व स्टेट ट्रान्सफर। बस राज्य भेजें, तरीकों से नहीं।

बी करने के लिए एक से एक वस्तु एक्स स्थानांतरित करने के लिए, हम यह करते हैं।

  1. एक एनकोड कुछ आसान, आसानी से पार्स अंकन में एक्स के राज्य। JSON लोकप्रिय है।

  2. ए, बी के लिए JSON टेक्स्ट

  3. बी एक्स प्रपत्र JSON अंकन के राज्य डीकोड भेजता पुनर्निर्माण एक्स

बी इस के लिए एक्स के वर्ग के लिए वर्ग परिभाषाओं होना आवश्यक है काम करने के लिए। बी में सभी कार्य और अन्य वर्ग परिभाषाएं होनी चाहिए जिन पर एक्स की कक्षा निर्भर करती है। संक्षेप में, ए और बी दोनों की सभी परिभाषाएं हैं। ऑब्जेक्ट के राज्य का केवल एक प्रतिनिधित्व स्थानांतरित हो जाता है।

REST पर कोई लेख देखें।

http://en.wikipedia.org/wiki/Representational_State_Transfer

http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm

+0

क्या आप कृपया बता सकते हैं कि यह पद्धति घटना प्रणाली के साथ मेरी समस्या से कैसे संबंधित है? –

+4

यह एक "आप इसे गलत कर रहे हैं" उत्तर है। यह विचार यह है कि 'अचार' शायद पाइथन में थोड़ा * सुविधाजनक * सुविधाजनक है; सादा पुराने डेटा का आदान-प्रदान करना वास्तव में बेहतर है (ऑब्जेक्ट ग्राफ़ के विपरीत) क्योंकि इसका परिणाम सरल सिस्टम में होता है जो कि कारणों के लिए उपयुक्त हैं। उसमें कुछ है, लेकिन यदि यह आपके लिए उपयोगी है तो यह दीर्घकालिक तरीके से सहायक होगा। –

-3

अचार उदाहरण है और फिर इसे unpickling के बाद विधि का उपयोग। एक उदाहरण की एक विधि को चुनना समझ में नहीं आता है क्योंकि यह उदाहरण पर निर्भर करता है। यदि ऐसा नहीं होता है, तो इसे एक स्वतंत्र कार्य के रूप में लिखें।

import pickle 

class A: 
    def f(self): 
     print 'hi' 

x = A() 
f = open('tmp', 'w') 
r = pickle.dump(x, f) 
f.close() 
f = open('tmp', 'r') 
pickled_x = pickle.load(f) 
pickled_x.f() 
+1

ए() एक उदाहरण विधि नहीं है। –

+1

आपने वस्तु को उठाया, उदाहरण विधि नहीं। एक इंस्टेंस विधि को सीधे चुनने का प्रयास करें। –

+0

उदाहरण को अचार करें और फिर इसे अनपिक करने के बाद विधि तक पहुंचें। किसी उदाहरण की विधि चुनना समझ में नहीं आता है क्योंकि यह उदाहरण पर निर्भर करता है। यदि ऐसा नहीं होता है, तो इसे एक स्वतंत्र कार्य के रूप में लिखें। –

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