web-gelistirme-sc.com

Python AttributeError: Nesnenin özniteliği yok

MyThread sınıfım var. Bu konuda bir yöntem örneğim var. Aynı nesne bağlamında çalışmasını sağlamaya çalışıyorum. Lütfen koda bir göz atın:

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()

Çok basit görünüyor değil mi? Ama kaçtığımda bu hatayı alıyorum

AttributeError: 'myThread' object has no attribute 'sample' Şimdi tam da bu yönteme sahibim. Yani ne yanlış? Lütfen yardım et

Düzenleme: Bu stacktrace

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'

Ben böyle çağırıyorum

arThreads = []
maxThreads = 2;

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

Üzgünüz redisOps sınıf kodunu gönderemiyorum. Fakat sizi temin ederim ki bu gayet iyi çalışıyor

41
Shades88

Girintiniz şaşırır ve sekmeleri ve boşlukları karıştırdınız. Doğrulamak için betiği python -tt ile çalıştırın.

68

Python çoklu iş parçacığında bu tür hatalar yaygındır. Olan şu ki, tercüman yırttığında, ilgili modül (bu durumda myThread) bir tür del myThread işleminden geçer. 

self.sample() çağrısı kabaca myThread.__dict__["sample"](self) işlevine eşdeğerdir. Eğer tercümanın parçalanma sırası sırasındaysak, bilinen türden kendi sözlüğünde myThread silinmiş olabilir, ve şimdi temelde bir NoneType - var ve 'sample' özniteliği yok.

6
Trevor

Python 3> kullanmanız, çift alt çizgi ile başlayan özel değişkenler kullanmanız durumunda da ortaya çıkabilir, örneğin, öz.

2
Timothy

Aynı hatayla da karşılaştım. Girintimin bir sorunu olmadığından eminim. Sadece python satışını yeniden başlatmak sorunu çözdü. 

0

Çok iş parçacıklı senaryo için bu hatayı aldım (özellikle ZMQ ile çalışırken). Başka bir iş parçacığı zaten veri göndermeye başlarken soketin hala bir iş parçacığına bağlı olduğu ortaya çıktı. Başka bir iş parçacığı nedeniyle meydana gelen olaylar, henüz oluşturulmamış değişkenlere erişmeye çalıştı. Senaryonuz çok iş parçacıklı içeriyorsa ve bir miktar gecikme eklerseniz işler işe yararsa, benzer bir sorun yaşayabilirsiniz.

0
Shital Shah

Mitte adında başka bir değişken bulunduğunda da aynı hata oluştu. Bu değişken bunun üzerine yazdı ve bu yüzden hata yaptım

0
remobob

Python bu üyeleri, sınıf adını içerecek şekilde ismi dahili olarak değiştirerek korur. Böyle nesnelere object._className__attrName olarak erişebilirsiniz. 

0
Shyam Gupta

Bu, slot in class kullanıyorsanız ve bu yeni özelliği henüz slotlara eklememişseniz de oluşabilir.

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'
0
Mitendra