[python] Brainstorm request: Vyuka programovani na gymplu

Filip Štědronský regnarg na seznam.cz
Sobota Červen 7 10:17:11 CEST 2008


On Pá, čen 06, 2008 at 07:09:35 +0200, slush wrote:

>  >>> class str(str):
> ...     def zzzmojefce(self):
> ...             return "blabla"
> ...
> >>> str().zzzmojefce()
> 'blabla'
> >>> "xxx".zzzmojefce()
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> AttributeError: 'str' object has no attribute 'zzzmojefce'

Zdravím,
    Vaše připomínka je zcela nelogická. Osobně jsem pojem
"emulation by class" nepochopil, Java jako jazyk má
prostě příliš chudou syntaxi a sémantiku a hlavně je moc
ukecaná (napíšete hodně a dostanete málo), a je to jazyk,
ve kterém se bez IDE nedá nic delšího napsat.
Nedokonalosti jazyka nenahradí sebelepší nástroje. Ale to
jsem trochu odbočil k předchozím připomínkám.

To, na co upozorňujete, je ovšem něco úplně jiného. Říká
se tomu hodnotový princip "všechno je objekt", protože v
Pythonu každá hodnota je objekt, zato Java Vás pouze nutí
cpát KÓD do objektů, i když je ryze neobjektový, což
zjevně vede k nepřehlednosti. Java diktuje programátorům
JAK PROGRAMOVAT.

Ale přístup Pythonu je diametrálně odlišný. To, že každá
hodnota je "objekt", což je de facto virtuální pojem,
který jediný co říká, je že se všemi hodnotami můžeme
pracovat stejně. Jsou si rovny. Je to jednotící princip,
který nás zbavuje utrpení s datovými typy. Nejhorší věc,
kterou totiž mohou OO jazyky udělat, je duplikace
principů (což dělá i slavně objektová Javaú, totiž že
máme objekty a "základní typy". Tyto typy občas zabalíme,
občas rozbalíme, a kdo se má vyznat v tom, jestli zrovna
pracuje s float nebo Float ?

Konkrétní problém, který ukazujete, ve skutečnosti
problémem není. String je opravdovým objektem jako každý
jiný, rovnocenný jakýmkoliv jiným, není to žádná emulace.
Jenže Váš kód NEUPRAVUJE třídu str (takové šílenosti jdou
asi jen v Ruby), ale definuje novou třídu, která je
odvozená od str a shodou náhod se jmenuje také str, a tu
vloží do aktuálního lokálního namespace.

Jenže Python když narazí na úvozovky neprohledává lokální
namespace, jestli tam náhodou není něco, co se jmenuje
str a co by mohl použít, což by ani nešlo, protože
konstruktoru takové třídy by musel předat nějaký parametr
— nejspíš řetězec — a ten by vytvořil JAK ? Ne, Python
zcela automaticky vytvoří instanci vestavěného typu str,
na který se odkazuje přímo, a ne prostřednictvím jeho
názvu, identifikátor "str" slouží jen pro uživatele,
Python jej nepotřebuje. Interpreter vytvoří interně
instanci třídy str, která je implementovaná v C a je mu
úplně jedno, co všechno si pojmenujete str.

---
regnarg --- http://rg.pretel.cz -- JID: regnarg na jabber.cz
V péči o štěstí druhých nacházíme své vlastní.   --Platón
Přátelství může trvat jedině mezi dobrými lidmi. --Cicero



Další informace o konferenci Python