为啥我得到 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'