为啥我得到 AttributeError: Object has no attribute? [关闭]

Posted

技术标签:

【中文标题】为啥我得到 AttributeError: Object has no attribute? [关闭]【英文标题】: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 代码时,您应该在代码编辑器中选择“显示制表符和空格” 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

它是否记录在 PIP 中? 刚刚遇到问题,发现了这条评论,他们为什么要这样设计? 记录在这里:docs.python.org/3/tutorial/classes.html#private-variables【参考方案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 中。

以上是关于为啥我得到 AttributeError: Object has no attribute? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我得到 AttributeError: Object has no attribute? [关闭]

为啥我得到 AttributeError: Object has no attribute? [关闭]

为啥我得到 AttributeError:'LinearRegressionGD' 对象没有属性 'n_iter'

继承人一些异步代码为亚马逊搜索提供硒队列,为啥我得到 AttributeError? __init__ 没有运行?

谁能告诉我为啥我收到错误 [AttributeError: 'list' object has no attribute 'encode']

为啥我收到错误:AttributeError:'builtin_function_or_method'对象没有属性'isdigit'