Tôi đang triển khai một lớp đơn giản để biểu diễn vectơ 2D. Dưới đây là các bước của liên quan:Lỗi lạ của Python: đối tượng "LoạiError: 'NoneType' không thể gọi"
class Vector:
def __init__(self, x, y):
self.vec_repr = x, y
def __add__(self, other):
new_x = self.x + other.x
new_y = self.y + other.y
return Vector(new_x, new_y)
def __getattr__(self, name):
if name == "x":
return self.vec_repr[0]
elif name == "y":
return self.vec_repr[1]
Sau đó, tôi có một cái gì đó như:
a = Vector(1, 1)
b = Vector(2, 2)
a + b
tôi nhận được TypeError: 'NoneType' object is not callable
. Điều này đặc biệt lạ vì lỗi không được đánh dấu là đang ở trên bất kỳ dòng cụ thể nào, vì vậy tôi không biết phải tìm đâu!
Rất lạ, vì vậy tôi đã thực hiện một số thử nghiệm và phát hiện ra rằng nó xảy ra trên dòng a+b
. Ngoài ra, khi tôi làm lại lớp học như sau:
class Vector:
def __init__(self, x, y):
self.x, self.y = x, y
def __add__(self, other):
new_x = self.x + other.x
new_y = self.y + other.y
return Vector(new_x, new_y)
Lỗi này biến mất!
Tôi thấy rằng có rất nhiều câu hỏi về một lỗi tương tự như vậy - tất cả dường như liên quan đến một số tên hàm bị ghi đè ở đâu đó bởi một biến, nhưng tôi không thấy nơi này đang xảy ra!
Là đầu mối khác, khi tôi thay đổi kiểu trả về mặc định của __getattr__()
đến cái gì khác - str, ví dụ - các lỗi biến thành TypeError: 'str' object is not callable
Bất kỳ ý tưởng như những gì đang xảy ra? Có một số hành vi của __getattr__()
mà tôi không hiểu không?
và chỉ dành riêng cho các bức tranh hoàn chỉnh, nó cố gắng gọi '__coerce__' –
@yi_H Tôi không quen thuộc với '__coerce__', nhưng tôi có thể đoán những gì nó sẽ làm gì, và tại sao nó sẽ được gọi là! –
Ooh. Ồ cảm ơn nhé. Tôi nghĩ rằng nó rơi trở lại trên __getattr __() khi nó không tìm thấy thuộc tính ở nơi khác. Vâng, điều này cực kỳ lúng túng. – Slubb