在 Python 中使用具有以下语法的类的魔术方法有什么区别:method(member) 和 member.__method__()?

问题描述

我创建了一个类并使用以下代码指定了成员的属性

Mexico_66 = Product('Mexico 66 VIN',99.90,4)

在类中,我定义了以下魔术方法

def __len__(self):
    print(self.quantity)

当我尝试使用具有以下语法的魔术方法时:len(Mexico_66),代码执行但在最后发出错误:TypeError: 'nonetype' object cannot be interpret as an integer

但是,当使用以下语法执行代码时:Mexico_66.len(),没有出现错误

我不太明白为什么在第一种情况下会导致错误以及执行魔术方法的第一个和第二个选项之间有什么区别。如果有人能解释一下,我将不胜感激。

解决方法

__len__ 魔法方法应该返回一些东西,在这种情况下,可能是 return self.quantity。您收到类型错误是因为您的方法隐式返回 None

使用这些魔术方法的想法是为常用函数(如 len())定义行为。如果您使用 instance.__len__() 调用它,则您没有使用魔术方法,您只是像常规实例方法一样调用它,这就是为什么您在该用例中看不到任何错误