97

我有一堂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 类代码。但我可以向你保证,它工作得很好

4

9 回答 9

106

您的缩进是错误的,并且您混合了制表符和空格。运行脚本以python -tt进行验证。

于 2012-07-27T10:41:22.057 回答
24

如果您使用的是 python 3+,如果您使用以双下划线开头的私有变量,例如 self.__yourvariable,也可能会发生这种情况。对于可能遇到此问题的某些人来说,这是需要注意的事情。

于 2018-08-03T15:03:21.007 回答
15

在 Python 多线程中,这类错误很常见。发生的情况是,在解释器拆卸时,相关模块(myThread在这种情况下)经历了一种del myThread.

该调用self.sample()大致相当于myThread.__dict__["sample"](self). 但是如果我们在解释器的拆卸序列中,那么它自己的已知类型字典可能已经被myThread删除,现在它基本上是一个NoneType- 并且没有“样本”属性。

于 2015-07-29T13:12:35.743 回答
9

如果您在类中使用插槽并且尚未在插槽中添加此新属性,也可能会发生这种情况。

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'
于 2019-05-19T17:08:21.337 回答
2

我在多线程场景中遇到了这个错误(特别是在处理 ZMQ 时)。事实证明,套接字仍在一个线程上连接,而另一个线程已经开始发送数据。由于另一个线程尝试访问尚未创建的变量而发生的事件。如果您的场景涉及多线程,并且如果您增加一点延迟,事情会正常工作,那么您可能会遇到类似的问题。

于 2018-12-20T03:15:41.217 回答
1

当我有另一个名为 mythread 的变量时发生了同样的错误。该变量覆盖了这个,这就是我得到错误的原因

于 2019-04-16T02:02:01.080 回答
1

Python 通过在内部更改名称以包含类名来保护这些成员。您可以访问以下属性object._className__attrName.

于 2016-06-06T07:51:17.183 回答
0

我也遇到了同样的错误。我确信我的缩进没有任何问题。只有重新启动 python sell 才能解决问题。

于 2019-01-02T21:58:24.653 回答
-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 是一个私有方法。

于 2018-09-25T15:28:09.317 回答