मुझे गुण क्यों मिल रहा है: वस्तु की कोई विशेषता नहीं है [बंद]


82

मेरा एक वर्ग है MyThread। उसमे मेरे पास मेथड सैंपल है। मैं उसी वस्तु संदर्भ में इसे चलाने की कोशिश कर रहा हूं। कृपया कोड पर एक नज़र डालें:

class myThread (threading.Thread):
    def __init__(self, threadID, name, counter, redisOpsObj):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter
        self.redisOpsObj = redisOpsObj

    def stop(self):
        self.kill_received = True

    def sample(self):
        print "Hello"

    def run(self):
        time.sleep(0.1)
        print "\n Starting " + self.name
        self.sample()

बहुत सरल लगता है यह नहीं है। लेकिन जब मैं इसे चलाता हूं तो मुझे यह त्रुटि मिलती है

AttributeError: 'myThread' object has no attribute 'sample'अब मेरे पास वह तरीका है। तो क्या गलत हुआ? कृपया सहायता कीजिए

संपादित करें: यह स्टैकट्रेस है

Starting Thread-0

Starting Thread-1
Exception in thread Thread-0:
Traceback (most recent call last):
File "/usr/lib/python2.6/threading.py", line 525, in __bootstrap_inner
self.run()
File "./redisQueueProcessor.py", line 51, in run
self.sample()
AttributeError: 'myThread' object has no attribute 'sample'

Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python2.6/threading.py", line 525, in __bootstrap_inner
self.run()
File "./redisQueueProcessor.py", line 51, in run
self.sample()
AttributeError: 'myThread' object has no attribute 'sample'

मैं इसे इस तरह कह रहा हूं

arThreads = []
maxThreads = 2;

for i in range( maxThreads ):
    redisOpsObj = redisOps()
    arThreads.append( myThread(i, "Thread-"+str(i), 10, redisOpsObj) )

क्षमा करें, मैं redisOps वर्ग कोड पोस्ट नहीं कर सकता। लेकिन मैं आपको आश्वस्त कर सकता हूं कि यह ठीक काम करता है


कॉलस्टैक के साथ पूर्ण त्रुटि पोस्ट करेंगे?
— स्लॉथ

क्या आप कृपया उस कोड को जोड़ सकते हैं जिसे आप कॉल कर रहे हैं?
— बाबू

2
क्या कोई कोड गायब है। यह स्निपेट मेरे लिए काम करता है।
— थर्डऑन

2
मुझे बहुत अफसोस है। हाँ मेरा इंडेंटेशन ठगा हुआ था। अजगर में पूरी तरह से नौसिखिया। तो हो सकता है कि इंडेंटेशन की आलोचना पर चूक हुई हो।
— शेड्स 888

पायथन को कोड करते समय, आपको अपने कोड संपादक में "शो टैब्स एंड स्पेस" का चयन करना चाहिए
— vanduc1102

जवाबों:


94

आपका इंडेंटेशन नासमझ है, और आपने मिश्रित टैब और स्थान बनाए हैं। python -ttसत्यापित करने के लिए स्क्रिप्ट चलाएँ ।


उस आंख खोलने वाले के लिए धन्यवाद। इसे अब पा लिया है। मूर्खतापूर्ण प्रश्न और इस तरह के प्रश्न की बहुत लंबी व्याख्या के लिए क्षमा करें;)
— शेड्सडू

3
क्या आप मुझे बताएंगे कि "स्क्रिप्ट को अजगर से सत्यापित करने के लिए चलाएँ" का क्या अर्थ है?
— akshay_rahar

9
@ नक्श_राहर:python -tt script.py
— इग्नासियो

1
तो, यह जादू पैरामीटर क्या करता -ttहै? मैंने इसे डॉक्स
— Noukasz Nojek

10
अद्यतन: -ttझंडा पायथन 3 में मौजूद नहीं है, यह पायथन 2 में था
— isukasz Nojek

13

यदि आप अजगर 3+ का उपयोग कर रहे हैं, तो यह तब भी हो सकता है यदि आप निजी चर का उपयोग कर रहे हैं जो कि डबल अंडरस्कोर के साथ शुरू होता है, उदाहरण के लिए, स्व .__ आपका। आप में से कुछ के लिए बस कुछ ध्यान रखना चाहिए जो इस मुद्दे पर चल सकता है।


क्या यह एक पीआईपी में प्रलेखित है?
— २०:२० को १२:१२

1
बस इस मुद्दे को चलाने और इस टिप्पणी को पाया, वे इसे क्यों डिजाइन करेंगे?
— मैथ्यू झांग

1
यह यहाँ प्रलेखित है: docs.python.org/3/tutorial/classes.html#pStreet-variables
— मोहित

12

पायथन मल्टी-थ्रेडिंग के समय इस तरह के कीड़े आम हैं। क्या होता है, दुभाषिया आंसू-डाउन पर, संबंधित मॉड्यूल ( myThreadइस मामले में) एक तरह का होता है del myThread।

कॉल self.sample()लगभग बराबर है myThread.__dict__["sample"](self)। लेकिन अगर हम दुभाषिया के आंसू-डाउन अनुक्रम के दौरान हैं, तो ज्ञात प्रकारों का अपना शब्दकोश पहले ही myThreadहटा दिया गया है, और अब यह मूल रूप से एक है NoneType- और इसका कोई 'नमूना' विशेषता नहीं है।


7

यह तब भी हो सकता है यदि आपके वर्ग में स्लॉट का उपयोग कर रहे हैं और अभी तक स्लॉट में इस नए विशेषता को नहीं जोड़ा है।

class xyz(object):
"""
class description

"""

__slots__ = ['abc', 'ijk']

def __init__(self):
   self.abc = 1
   self.ijk = 2
   self.pqr = 6 # This will throw error 'AttributeError: <name_of_class_object> object has no attribute 'pqr'

2

मुझे यह त्रुटि मल्टी-थ्रेडिंग परिदृश्य (विशेषकर ZMQ के साथ काम करते समय) के लिए मिली। यह पता चला कि सॉकेट अभी भी एक धागे से जुड़ा हुआ है, जबकि दूसरा धागा पहले ही डेटा भेजना शुरू कर देता है। अन्य थ्रेड के कारण होने वाली घटनाओं ने उन चरों को एक्सेस करने का प्रयास किया जो अभी तक नहीं बने थे। यदि आपके परिदृश्य में मल्टी-थ्रेडिंग शामिल है और यदि चीजें थोड़ी सी भी देरी के साथ काम करती हैं, तो आपके पास समान मुद्दा हो सकता है।


1

पायथन आंतरिक रूप से वर्ग नाम को शामिल करने के लिए नाम बदलकर उन सदस्यों की रक्षा करता है। आप ऐसी विशेषताओं को ऑब्जेक्ट के रूप में एक्सेस कर सकते हैं। _className__attrName


0

मुझे भी उसी त्रुटि का सामना करना पड़ा है। मुझे यकीन है कि मेरे इंडेंटेशन में कोई समस्या नहीं थी। केवल अजगर बेचने को फिर से शुरू करने से समस्या हल हो गई।


आप पुनरारंभ कर सकते हैं या जो कुछ भी आप कर सकते हैं। यह शुरुआती लोगों के लिए मददगार हो सकता है।
— खान

0

वही त्रुटि तब हुई जब मेरे पास माइथ्रेड नामक एक अन्य चर था। उस चर ने इसे खत्म कर दिया और इसलिए मुझे त्रुटि मिली


-3

आप किसी कक्षा के निजी क्षेत्रों के बाहर नहीं पहुँच सकते। निजी क्षेत्र __ से शुरू हो रहे हैं। उदाहरण के लिए -

class car:
    def __init__(self):
        self.__updatesoftware()

    def drive(self):
        print("driving")

    def __updatesoftware(self):
        print("updating software:")

obj = car()
obj.drive()  
obj.__updatesoftware()  ## here it will throw an error because 

__updatesoftware एक निजी विधि है।


3
लेखक एक निजी पद्धति का उपयोग करने की कोशिश नहीं कर रहा है, यह सवाल भी 6 साल से अधिक पुराना है और पहले से ही हल हो गया है इसलिए इसे फिर से उत्तर देने की कोशिश करने की कोई आवश्यकता नहीं है।
— जोहान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.