@ není anotace, ale dekorátor. Takovou classmethod si můžete zjednodušeně představit...
Je mi buřt, jak se to jmenuje (dekorátor je pro mě návrhový vzor), vnitřní implementace je nepodstatná. Představoval bych si, že vedle klíčového slova def tu bude např. classdef, aby bylo jasné, co je definováno na třídní a co na instanční straně. Tyto anotace/dekorátory na mě dělají dojem dobastlovaného jazyku.
Ty "neobjektové" funkce si představte jako implementaci určitého protokolu. Díky duck typingu nemusí mít objekt miliardy metod pro všechny možné situace. Proto také můžou existovat věci jako len(), iter(), next(), ... které ho využívají. Pokud vím, že něco je kolekce, len() na to bude fungovat a určitým postupem zjistí, kolik je v ní prvků. Taky můžu udělat např. max(map(len, iterable)). max(map(lambda i: i.len(), iterable)) by bylo krkolomnější. Rubysta by namítl, že iterable.collect(&:len) je lepší, ale každý jazyk má své vlastnosti 
Nechápu. Proč budu "určitým postupem" zjišťovat, kolik je v kolekci prvků, když se jí můžu rovnou zeptat? Oč jsou uvedené funkce jednodušší, koncepčnější a přehlednější než seznam.len(), seznam.forEach(), seznam.max(), ... Tohle se mi jeví jako zbytečný bastl za účelem lezení do zadku uživatelům zvyklým na imperativní jazyky.
Pepa vyrobí .size(), Franta vyrobí .length(), Honza vyrobí .len() ... a pak se v tom vyznej (to už se mi stalo).
Generické věci využívající generické protokoly nemusí bordelit třídní namespace a zbytečně komplikovat dědičnost. Například len() se podívá, jestli si třída implementuje __len__ a pokud ne, tak si ji projde a spočítá počet prvků, takže funguje s čímkoliv, co je iterable. Ditto ostatní takové věci. Ale Control-Space Enter, já vím.
Navíc python do jisté míry podporuje funkcionální styl programování, kde se
přesně takové věci dělají. A když už mám jazyk, co takové programování podporuje, tak proč bych to nevyužil? Šetří to psaní, lépe se píšou výrazy ve funkcionálním stylu.
A ano, třídy a objekty jsou v pythonu víceméně pouze "glorifikované dicty", které se dají měnit jak se zamane. Je ale na odpovědnosti programátora, aby psal slušně a ne jak prase. Když si někde vytvořím _my_private, tak by v code review mělo být nad slunce jasné, že když někdo napíše neco._my_private, že je něco asi špatně.
Když se člověk začte do dokumentace, tak zjistí, že vnitřnosti jsou poměrně jednoduché a jsou okolo mechanismy, které se dají ovlivnit aby si člověk ušetřil psaní, zkontroloval data, která se předávají, vytvořil něco na způsob DSL... Takový přístup umožňuje větší kontrolu nad tím, co se děje a nabízí více možností, jak splnit úkol. A třeba to i pěkně napsat.