Instead of using common OOP, like Java and C# do with their base class Object or object, Python uses special methods for basic behaviour of objects. Python uses __str__ which is used when the object is passed to print:
>>> class Demo:
>>> def __str__(self):
>>> return "representation"
>>> d = Demo()
>>> print(d)
representation
The same with len:
>>> class Ruler:
>>> def __len__(self):
>>> return 42
>>> r = Ruler()
>>> len(r)
42
What I would expect is something like this:
>>> class Ruler:
>>> def len(self):
>>> return 42
>>> r = Ruler()
>>> r.len()
42
What is the reason for using special methods indirectly instead of calling usual methods directly?
The reason for this is explained well in the Python documentation here:
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
(This was answered in the comments, but needs to be shown as a real answer for the sake of future readers.)