为什么会出现AttributeError:'NoneType'对象没有属性'something'?


291

我不断收到错误消息,说

AttributeError: 'NoneType' object has no attribute 'something'

我的代码太长,无法在此处发布。什么一般情况会导致这种情况AttributeError,这NoneType意味着什么,我如何缩小正在发生的事情?


8
拉出最小的代码来演示问题。张贴。添加print函数(或取决于版本的语句)以揭示存在此问题的代码中变量实际具有的实际值。
S.Lott 2012年

1
“ NoneType”的平均类型=无。您可能正在尝试访问未声明的变量。您应该发布要点,以便我们为您提供帮助。
卢瓦克G.

2
@LoïcGRENON:“未声明的变量”?在Python中?那没有多大意义。一个人如何声明一个变量?
美国洛特

2
@LoïcGRENON-不是在Python中不是。您会收到一个“分配前被引用”异常。变量不默认为None
gddc 2012年

1
@LoïcGRENON:您是否有一些代码可以证明您正在谈论的这个想法?
S.Lott 2012年

Answers:


287

NoneType意味着您实际上拥有了而不是您认为正在使用的任何Class或Object的实例None。这通常意味着在上面的赋值或函数调用失败或返回了意外结果。


111

您有一个等于None的变量,并且您试图访问它的名为“ something”的属性。

foo = None
foo.something = 1

要么

foo = None
print foo.something

两者都会产生一个 AttributeError: 'NoneType'


9
除非您指出人们最终如何摆脱困境,否则这可能无济于事None。一个明确foo = None的问题不太可能成为问题。它将是这样,foo = something()并且您没有意识到something()可能会None在不成功或结果集为空或任何其他内容时返回。
Tripleee '19

54

其他人则解释了什么NoneType是结束它的常见方法(即,无法从函数返回值)。

另一个None不希望看到的常见原因是在可变对象上分配了就地操作。例如:

mylist = mylist.sort()

sort()列表的方法对列表进行原位排序,mylist即被修改。但是该方法的实际返回值None不是对列表进行排序。因此,您刚刚分配Nonemylist。如果您下次尝试这样做,mylist.append(1)Python会给您这个错误。


这是一个很好的解释-有点像在c#中获取空引用异常。该变量没有分配的值,并且为None .. Thx。

17

NoneType是该值的类型None。在这种情况下,变量lifetime的值为None

发生这种情况的一种常见方法是调用缺少a的函数return

但是,还有无数其他方法可以将变量设置为“无”。


1
我认为(pre-edit)lifetime的价值不高None。他正在尝试访问的其他属性的生命周期属性None
gddc

13

考虑下面的代码。

def return_something(someint):
 if  someint > 5:
    return someint

y = return_something(2)
y.real()

这会给你错误

AttributeError:“ NoneType”对象没有属性“ real”

所以要点如下。

  1. 在代码中,函数或类方法未返回任何内容或未返回None
  2. 然后,您尝试访问该返回对象的属性(即None),从而导致错误消息。

4

这意味着您正在尝试访问的对象NoneNoneNullpython中的变量。这种类型的错误发生在您的代码上,就像这样。

x1 = None
print(x1.something)

#or

x1 = None
x1.someother = "Hellow world"

#or
x1 = None
x1.some_func()

# you can avoid some of these error by adding this kind of check
if(x1 is not None):
    ... Do something here
else:
    print("X1 variable is Null or None")

1

gddc是正确的,但添加了一个非常常见的示例:

您可以以递归形式调用此函数。在这种情况下,您可能会以空指针或结尾NoneType。在这种情况下,您会收到此错误。因此,在访问该参数的属性之前,请检查它是否不是NoneType


是的,好的,但是您如何检查?
not2qubit

如果foo == None:
barribow

if foo is not None:
Gringo Suave

1

建立估算器(sklearn)时,如果忘记在fit函数中返回self,则会得到相同的错误。

class ImputeLags(BaseEstimator, TransformerMixin):
    def __init__(self, columns):
        self.columns = columns

    def fit(self, x, y=None):
        """ do something """

    def transfrom(self, x):
        return x

AttributeError:'NoneType'对象没有属性'transform'?

添加return self到拟合功能可修复该错误。


0

在Flask应用程序中注释掉HTML时,可能会出现此错误。此处qual.date_expiry的值为None:

   <!-- <td>{{ qual.date_expiry.date() }}</td> -->

删除行或修复它:

<td>{% if qual.date_attained != None %} {{ qual.date_attained.date() }} {% endif %} </td>

-1

如果我们分配如下所示的内容,则会引发错误,例如“ AttributeError:'NoneType'对象没有属性'show'”

df1=df.withColumn('newAge',df['Age']).show() 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.