Python没有像Java和C那样对基类Object
或{__str__
,当对象被传递到print
时使用:
>>> class Demo:
>>> def __str__(self):
>>> return "representation"
>>> d = Demo()
>>> print(d)
representation
与len
相同:
我所期望的是:
>>> class Ruler:
>>> def len(self):
>>> return 42
>>> r = Ruler()
>>> r.len()
42
为什么要间接使用特殊方法而不是直接调用普通方法?在
这些不是钩子。在
它们只是具有特殊名称的方法。在
Python中特殊方法名的约定是
__name__
。在内置的len、iter、str、repr(和其他)函数使用普通方法,这些方法的名称遵循一个特殊的约定,这样我们就可以确保我们已经正确地实现了这些特殊方法。在
特殊的方法有奇怪的名字,所以我们可以自由使用任何我们想要的名字,而不必担心冲突。在
也许是为了你。对其他人来说,这可能完全令人困惑。在
Python对许多常见函数都有方法表示法和函数表示法。在
最好使用函数表示法。在
它仍然是面向对象编程。只改变了符号。在
这里的Python文档对其原因进行了很好的解释:
http://docs.python.org/faq/design.html#why-does-python-use-methods-for-some-functionality-e-g-list-index-but-functions-for-other-e-g-len-list
(这在评论中得到了回答,但为了将来的读者,需要将其作为真实答案显示出来。)
钩子允许重新定义标准函数的行为。考虑重写
__add__()
并使用标准中缀+
运算符,而不是添加自定义add()
并使用嵌套调用。在此外,如果定义
__iter__()
,则可以在for ... in
循环中使用对象。将其与控制循环和手动推进迭代相比较。考虑重写__call__()
并将实例转换为函数,与其他函数一样好。这给了我们极大的灵活性。在如果您愿意,Java对
.toString()
也做了同样的处理,当您打印对象或将其连接到一个字符串时,它隐式地工作。在相关问题 更多 >
编程相关推荐