Tại sao tôi nhận được AttributionError: đối tượng 'noneType' không có thuộc tính 'cái gì đó'?


292

Tôi liên tục nhận được một lỗi nói

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

Mã tôi có quá dài để đăng ở đây. Những kịch bản chung nào sẽ gây ra điều này AttributeError, điều gì được NoneTypecho là có nghĩa và làm thế nào tôi có thể thu hẹp những gì đang diễn ra?


8
Rút ra một chút mã nhỏ nhất thể hiện vấn đề. Đăng rằng. Thêm các printhàm (hoặc câu lệnh tùy thuộc vào phiên bản) để tiết lộ các giá trị thực tế mà các biến thực sự có trong mã có vấn đề này.
S.Lott

1
Loại không có nghĩa 'Không loại' = Không có. Bạn có thể đang cố gắng truy cập vào một biến không được khai báo. Bạn nên đăng một ý chính để chúng tôi có thể giúp bạn.
Loïc G.

2
@ LoïcGRENON: "biến không khai báo"? Trong Python? Điều đó không có ý nghĩa nhiều. Làm thế nào một người sẽ khai báo một biến?
S.Lott

2
@ LoïcGRENON - Không phải trong Python, không phải vậy. Bạn nhận được một ngoại lệ "được tham chiếu trước khi chuyển nhượng". Các biến không mặc định None.
gddc

1
@ LoïcGRENON: Bạn có một số mã thể hiện ý tưởng này mà bạn đang nói đến không?
S.Lott

Câu trả lời:


287

Không có nghĩa là thay vì một thể hiện của bất kỳ Lớp hoặc Đối tượng nào bạn nghĩ rằng bạn đang làm việc với, bạn thực sự đã có None. Điều đó thường có nghĩa là một nhiệm vụ hoặc chức năng gọi lên trên không thành công hoặc trả về một kết quả không mong muốn.


111

Bạn có một biến bằng với Không và bạn đang cố truy cập vào một thuộc tính của nó được gọi là 'cái gì đó'.

foo = None
foo.something = 1

hoặc là

foo = None
print foo.something

Cả hai sẽ mang lại một AttributeError: 'NoneType'


9
Điều này có thể không có ích cho đến khi bạn chỉ ra làm thế nào mọi người cuối cùng có thể Nonethoát khỏi một cái gì đó. Một điều rõ ràng foo = Nonekhông chắc là vấn đề; nó sẽ xảy ra foo = something()và bạn không nhận ra something()có thể trở lại Nonekhi nó không thành công hoặc tập kết quả trống hoặc bất cứ điều gì.
tripleee

54

Những người khác đã giải thích những gì NoneTypevà một cách phổ biến để kết thúc với nó (nghĩa là không trả lại giá trị từ một hàm).

Một lý do phổ biến khác mà bạn có Nonenơi bạn không mong đợi đó là việc chỉ định một hoạt động tại chỗ trên một đối tượng có thể thay đổi. Ví dụ:

mylist = mylist.sort()

Các sort()phương pháp của một danh sách sắp xếp các danh sách tại chỗ, đó là, mylistđược sửa đổi. Nhưng giá trị trả về thực tế của phương thức là Nonevà không phải là danh sách được sắp xếp. Vì vậy, bạn vừa được gán Nonecho mylist. Nếu bạn cố gắng làm tiếp theo, giả sử, mylist.append(1)Python sẽ cung cấp cho bạn lỗi này.


Đây là một lời giải thích tuyệt vời - giống như nhận được một ngoại lệ tham chiếu null trong c #. Biến không có giá trị được gán và là Không có .. Thx.
Ken

17

Đây NoneTypelà loại giá trị None. Trong trường hợp này, biến lifetimecó giá trị là None.

Một cách phổ biến để có điều này xảy ra là gọi một hàm bị thiếu a return.

Tuy nhiên, có vô số cách khác để đặt biến thành Không có.


1
Tôi không nghĩ rằng lifetimecó một giá trị None(chỉnh sửa trước). Anh ta đang cố gắng truy cập thuộc tính trọn đời của một thứ khác None.
gddc

13

Hãy xem xét mã dưới đây.

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

y = return_something(2)
y.real()

Điều này sẽ cung cấp cho bạn lỗi

AttributionError: Đối tượng 'noneType' không có thuộc tính 'real'

Vì vậy, điểm là như dưới đây.

  1. Trong mã, một phương thức hàm hoặc lớp không trả về bất cứ thứ gì hoặc trả về Không
  2. Sau đó, bạn cố gắng truy cập một thuộc tính của đối tượng được trả về (không có), gây ra thông báo lỗi.

4

Nó có nghĩa là đối tượng bạn đang cố gắng truy cập None. Nonelà một Nullbiến trong python. Loại lỗi này xảy ra với mã của bạn là một cái gì đó như thế này.

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 là đúng, nhưng thêm một ví dụ rất thường xuyên:

Bạn có thể gọi hàm này ở dạng đệ quy. Trong trường hợp đó, bạn có thể kết thúc tại con trỏ null hoặc NoneType. Trong trường hợp đó, bạn có thể nhận được lỗi này. Vì vậy, trước khi truy cập một thuộc tính của tham số đó, hãy kiểm tra nếu không NoneType.


Vâng, ok, nhưng làm thế nào để bạn kiểm tra?
not2qubit

if foo == Không có:
barribow

if foo is not None:
Gringo Suave

1

Khi xây dựng công cụ ước tính (sklearn), nếu bạn quên tự trả về hàm phù hợp, bạn sẽ gặp lỗi tương tự.

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

AttributionError: Đối tượng 'noneType' không có thuộc tính 'biến đổi'?

Thêm return selfvào chức năng phù hợp sửa lỗi.


0

Bạn có thể gặp lỗi này khi bạn đã nhận xét HTML trong ứng dụng Flask. Ở đây, giá trị cho Qual.date_Exiry là Không có:

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

Xóa dòng hoặc sửa nó lên:

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

-1

nếu chúng ta gán một cái gì đó như bên dưới, nó sẽ đưa ra lỗi là "AttributionError: đối tượng 'noneType' không có thuộc tính 'show'"

df1=df.withColumn('newAge',df['Age']).show() 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.