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

What is the difference between using magic method of a class with following syntaxes in Python: method(member) and member.__method__()?

我创建了一个class,指定了成员的属性,代码如下:

Mexico_66 = 产品('Mexico 66 VIN', 99.90, 4)

在class中,我定义了如下魔术方法:

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

当我尝试使用具有以下语法的魔术方法时:len(Mexico_66),代码执行但在最后给出错误:TypeError: 'NoneType' object cannot be解释为整数

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

不太明白第一种情况为什么会报错,执行魔术方法的第1和第2个选项有什么区别。如果有人能解释一下,我将不胜感激。

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

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