【问题标题】:Why am I getting AttributeError: Object has no attribute? [closed]为什么我得到 AttributeError: Object has no attribute? [关闭]
【发布时间】:2017-10-26 06:48:43
【问题描述】:

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

【问题讨论】:

  • 会在调用堆栈中发布完整的错误吗?
  • 能否请您添加您所调用的代码?
  • 是否缺少某些代码。这个 sn-p 对我有用。
  • 非常抱歉。是的,我的缩进被欺骗了。完全是python的新手。所以可能错过了缩进的重要性。
  • 在编写 Python 代码时,您应该在代码编辑器中选择“显示制表符和空格”

标签: python python-multithreading attributeerror


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    【解决方案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 是一个私有方法。

    【讨论】:

    • 作者不是试图访问私有方法,这个问题也有6年多了,已经解决了,所以没有必要再次尝试回答。
    【解决方案4】:

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

    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'
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 您可以发布命令以重新启动或执行任何操作。可能对初学者有帮助。
        • 如何“重启python卖”?
        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

            【解决方案9】:

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

            【讨论】:

            • 感谢您的大开眼界。现在明白了。对不起,愚蠢的问题和对此类问题的解释太长;)
            • 你能告诉我“用python -tt运行脚本来验证”是什么意思吗?
            • @akshay_rahar: python -tt script.py
            • 那么,-tt 这个神奇的参数有什么作用呢?我在docs 中没有找到
            • 更新:-tt 标志在 Python 3 中不存在,它在 Python 2 中。
            猜你喜欢
            • 2022-11-14
            • 2021-08-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-12-01
            相关资源
            最近更新 更多