Tak to máte docela nízké požadavky na kvalitu. Python je sice syntakticky přehledný a má dost knihoven, takže se v něm rychle dělá, ale ZCELA ZBYTEČNĚ obsahuje neobjektové konstrukce (len(řetězec), ...), na zapouzdření dlabe (přestože implementace by pravděpodobně ani nebyla složitá), definice třídních metod je řešena nekoncepčně přes jakési anotace... To mě napadá jen tak z hlavy, na co jsem stihnul zběžně narazit.
Neobjektové konstrukce nejsou zbytečné, python není oop jazyk, ale hybridní. Jestli mu neco vycist, tak to, ze by default krome len(list) neumi i list.len(). Zapouzdreni ma. Proc povazujete dekoratory za nekoncepcni? Python nepouziva modifikujici klicova slova, ale obecneji fungujici a uzivatelsky nastavitelne dekorarory, coz je koncept.
A jaký má smysl zavádět imperativní konstrukce s objekty, jestliže je to bez přínosu a komplikuje to jazyk i jeho implementaci?
Opravdu se tu nehodlám dohadovat s někým, co je to zapouzdření a zda jej má Python, OPRAVDU NE!
Proč tedy není i u instanční metody anotace "@instancemethod"?
@ není anotace, ale dekorátor. Takovou classmethod si můžete zjednodušeně představit jako wrapper který implementuje interface deskriptoru (__get__). Když python na třídě nebo objektu narazí na deskriptor, tak přenechá implementaci chování toho, co se má vrátit, tomu deskriptoru. A classmethod udělá to, že tu funkci nabinduje ne na objekt, ale na jeho třídu. Jakákoliv funkce sama o sobě má taky metodu __get__, takže pokud je ta funkce položená na třídě, tak při přístupu z instance objektu se vrátí nabindovaná na instanci toho objektu a při volání dostane jako první argument objekt. S deskriptory a __getattribute__/__setattribute__ protokolem se dá hodně vyhrát, myslím si, že i řízení přístupu by se s určitým performance hitem dalo vyrobit, ale proč bych to dělal ...
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

Dokonce se v pythonu dá udělat isinstance({}, Mapping), kde mapping není rodič třídy dict a přesto to vrátí True. Mapping je totiž ABC třída, která definuje jaké metody má mít něco, co se dá považovat za Mapping. A pokud je objekt má, není nejmenší pochyb o tom, jestli se chová jako Mapping nebo ne.