मेरे पास दो वर्ग हैं, classA और classBclassA में image नाम की एक विशेषता होती है जिसमें डेटा होता है जो हर समय बदलता रहता है। मैं classB का एक उदाहरण प्राप्त करने में सक्षम होना चाहता हूं कि जब मैं इस उदाहरण पर एक विधि को कॉल करता हूं, तो यह classA से self.image तक पहुंच सकता है। दुर्भाग्य से मेरे प्रयास विफल हो रहे हैं।

उदाहरण कोड:

classA:
    def __init__(self):
        self.image = None #initialise
        analysis = classB(self)

    def doingstuff(self):
        self.image = somethingchanginghere()
        measurement = analysis.find_something_cool()
        print measurement

classB:
   def __init__(self, master):
       self.image = master.image #get a reference to the data from other class

   def do_something_cool(self):
       return type(self.image) #find something about the data at the point when method is called

main = classA()
main.doingstuff()

मुझे एक त्रुटि मिलती है जो कहती है कि डेटा अभी भी None है, यानी यह अभी भी उस स्थिति में है जब इसे प्रारंभ किया गया था और classA से classB का संदर्भ अपडेट नहीं हुआ है जब self.image में क्लास ए बदल गया। मैंने क्या गलत किया है?

कार्यशील उदाहरण NoneType क्यों देता है? मैं एक यादृच्छिक संख्या की उम्मीद कर रहा हूँ।

-3
Sam 13 जुलाई 2016, 12:31
आपके print कथन Python 2.x का सुझाव देते हैं, लेकिन आप object से इनहेरिट नहीं करते हैं, इसलिए आपकी कक्षाएं "पुरानी शैली" की हैं, जो कि खराब अभ्यास है। साथ ही, class के बिना यह वाक्य रचना की दृष्टि से अमान्य है जैसा कि पोस्ट किया गया है। क्या numpy वास्तव में यहां प्रासंगिक है? क्या आप न्यूनतम प्रतिलिपि प्रस्तुत करने योग्य उदाहरण को और कम कर सकते हैं?
 – 
jonrsharpe
13 जुलाई 2016, 12:35
1
बस self.master = master करें और self.master.image का उपयोग करें। वह वस्तु अद्यतन के रूप में अद्यतन करता रहेगा।
 – 
deceze
13 जुलाई 2016, 12:37
कक्षा बी से भी पहले शुरू करें, यह भ्रमित करने वाला है! कक्षा A के init में आप init वर्ग B हैं, क्या आप फ़ैक्टरी पैटर्न बनाने का प्रयास कर रहे हैं?
 – 
e-nouri
13 जुलाई 2016, 12:38
मैं काम के उदाहरण को अन्य लोगों द्वारा परीक्षण योग्य बनाने के लिए numpy का उपयोग कर रहा था। ऐसा लगता है कि इसे वैसे भी संपादित किया गया है। मुझे समझ में नहीं आता कि 'पुरानी शैली' कक्षाओं से आपका क्या मतलब है
 – 
Sam
13 जुलाई 2016, 12:38
उत्तम! मैंने इसे ठीक वैसे ही काम कर लिया है जैसे मैं इसे अभी चाहता हूं। यह दूसरे तरीके से काम क्यों नहीं कर रहा था?
 – 
Sam
13 जुलाई 2016, 12:40

1 उत्तर

सबसे बढ़िया उत्तर

आपके कोड में दो समस्याएं हैं:

  1. analysis, classA.__init__ और classA.doingstuff फंक्शन के लिए एक वैरिएबल लोकल है। यदि आप इसे अन्य कार्यों में पुन: उपयोग करना चाहते हैं, तो आपको इसे एक विशेषता के रूप में परिभाषित करना चाहिए: self.analysis = classB(self)

  2. पायथन संदर्भ द्वारा चर पारित नहीं करता है। जब आप analysis = classB(self) करते हैं, तो आप classB का एक ऑब्जेक्ट बनाते हैं, ऑब्जेक्ट self को तर्क के रूप में पास करते हैं। यह ऑब्जेक्ट का संदर्भ नहीं है, इसलिए classB.image सेट किया गया है और/या केवल एक बार, classB.__init__ में बदला गया है। यदि आप इसे अद्यतन रखना चाहते हैं, तो आपको यह करना चाहिए:

    classB:
        def __init__(self, master):
            self.master = master
    

    और फिर छवि प्राप्त करने के लिए master.image का उपयोग करें, या एक classB विधि लागू करें उदा।

    def update(self, image): 
        self.image = image
    

    और इसे हर बार image बदलने पर कॉल करें।

1
Community 23 मई 2017, 15:14