ऑब्जेक्ट्स सूची समझ में विधियों को शामिल नहीं करते हैं

Nov 27 2020

यह प्रश्न मेरे पिछले प्रश्न और वहां बिल की प्रतिक्रिया से संबंधित है ।

मेरे पास एक वर्ग है जिसका नाम है Subucile.py

class StrucData:  
    def __init__(self, name):
        self.name=name
    
    def loadData(self, size=1, cost=1):
        self.size=size  
        self.cost=cost
        return self

मुख्य फाइल I में:

  1. सबफ़ाइल को कॉल करें,
  2. डेटा नामों की एक सूची बनाएँ
  3. वस्तुओं को त्वरित करने के लिए सूची के माध्यम से लूप; तथा
  4. प्रत्येक वस्तु के लिए 'लोडडेटा' विधि का उपयोग करके डेटा लोड करें (मैं इस उदाहरण को आसान बनाने के लिए समान आकार और लागत का उपयोग कर रहा हूं।)

एक सूची में एक समझ का उपयोग करके:

# in the main file

from subfile import StrucData 

listIndex=['data1','data2','data3']
listObjects = [StrucData(idx).loadData(size=3, cost=4) for idx in listIndex]

आउटपुट है

listObjects=[object1, object2, object3]

जिसमें प्रत्येक वस्तु में उप-प्रकार (नाम, आकार, लागत) में परिभाषित इसकी विशेषताएँ समाहित हैं।

जब मैं एक ही कोड का उपयोग करके एक वस्तु को परिभाषित करता हूं तो मुझे आश्चर्य होता है

x=StrucData(listIndex[0]).loadData(size=3, cost=4) 

इसमें 'लोडडाटा' विधि भी शामिल है।

क्या कोई मुझे समझा सकता है कि ऐसा क्यों होता है?

मैं स्पाइडर के एनाकोंडा 3 वितरण का उपयोग करता हूं, संस्करण की जानकारी है

जवाब

2 PatrickArtner Nov 27 2020 at 12:23

स्पाइडर के अंदर आपके एप्लिकेशन को डीबग करते समय उपयोग किया जाने वाला इंस्पेक्टर ऑब्जेक्ट्स को एक ही प्रकार की एकवचन वस्तुओं से अलग सूचियों के अंदर व्यवहार करता है। यह बस विभिन्न चीजों को प्रदर्शित करता है और - यदि सूची में - फ़ंक्शन को छोड़ देता है।

आप आसानी से जाँच कर सकते हैं कि क्या दोनों वस्तुओं में यह विधि है या नहीं:

listIndex = ['data1','data2','data3']
listObjects = [StrucData(idx).loadData(size=3, cost=4) for idx in listIndex]

other = StrucData("other").loadData(size=3, cost=4) 

print(listObjects[0].loadData)
print(other.loadData)

आप सूची तत्वों में से एक को सामान्य चर में निर्दिष्ट कर सकते हैं और सत्यापित करने के लिए उसके निरीक्षक आउटपुट की जांच कर सकते हैं:

lO = listObjects[1]

एक ब्रेकपॉइंट सेट करें और उसका निरीक्षण करें - अब विधि दिखाता है।

क्यों: स्पाइडर के डीबगिंग इंस्पेक्टर कोड के लिए जिम्मेदार कोडर्स से पूछें। एक खतरनाक अनुमान के रूप में: एक सूची के अंदर बंडल किए गए ऑब्जेक्ट्स को प्रदर्शित करते समय स्क्रीन एस्टेट को बचाने के लिए।