Ah díky za vyčerpávající odpověď, zmíněnou metodu už jsem zkoušel:<br><br><blockquote>class pff():<br>    asx = "mlam mlam"<br><br>__builtins__.__str__ = pff <br>__builtins__.str = pff<br>str = pff<br><br>"a".asx<br>
</blockquote>nicméně bez efektu. A ta druhá metoda nefunguje: <br><br><blockquote>" ".__class__.asx = "f"<br>TypeError: can't set attributes of built-in/extension type 'str<br></blockquote><br>
No ale to je jedno, jdu se kouknout do tarballu...<br><br><br><div class="gmail_quote">2010/11/3 Hynek Fabian <span dir="ltr"><<a href="mailto:hynek.fabian@firma.seznam.cz">hynek.fabian@firma.seznam.cz</a>></span><br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div class="im">> Ehm, ne, o to my nešlo, šlo mi o přepsání __builtin__ třídy str tak abych<br>

> přepsal chování instancí Stringu.<br>
<br>
</div>Tak jak to píšes ale na builtin nesáhneš!<br>
"class str(str)" ti udělá objekt jménem str v LOKÁLNÍM jmenném prostoru,<br>
nikoliv v builtins. V tomto kontextu tvůj lokální jmenný prostor je globální<br>
prostor modulu, ergo v jiných modulech zůstane str nezměněn.<br>
Sáhnout do builtins je možné a prosté:<br>
<br>
class MyStr(str): pass<br>
__builtins__.str = MyStr<br>
<br>
a je to. Všimni si že nemusíš mást budoucí generace tím, že to pojmenuješ<br>
stejně - konstruktor je sice viditelný pod jménem 'str', ale<br>
__class__.__name__ hotového objektu bude MyStr. Metody, potomci, etc. se bude<br>
odvolávat na objekt MyStr, pouze "uživatelé" jména 'str' potřebují znát nový<br>
objekt pod starým jménem.<br>
<br>
Leč, rychlý experiment ukáže, že interpret nekonstruuje řetězcové literály<br>
pomocí __builtins__.str, ale drží někde vlastní referenci na StringType. Řekl<br>
bych, že je to dobře, hrabání se v builtins je nejvetší prasárna nad jakou by<br>
se ještě dalo přivřít oko :-)<br>
Teoreticky bys mohl změnit chování zabudovaných řetězců hrabáním se přímo v<br>
jejich třídě:<br>
"a".__class__.asx = "asx"<br>
Změna přes referenci na třídu se okamžitě projeví u všech existujících<br>
instancí, potomků etc. Předefinováním metody __new__() bys mohl dokonce<br>
dosáhnout aby konstrukce objektu vracela instanci objektu úplně jiného typu,<br>
napříkald MyStr...<br>
Na(ne)štěstí taková konstrukce nefunguje přímo na zabudované objekty,<br>
protože ty nemají vlastní jmenný prostor ale jen neměnitelné sloty.<br>
Běžně to ničemu nevadí, protože jmenný prostor si můžeš opatřit prostě tím,<br>
že podědíš, čímž jsme zpátky u nevrtání se ve střevech interpretru :)<br>
<br>
Jiné řešení které mě napadá - projít rekurzivně zadaný jmenný prostor a<br>
instance StringType nenápadně proměnit. Není to sice tolik "automagické", ale<br>
taky mnohem bezpečnější.<br>
<div><div></div><div class="h5">_______________________________________________<br>
Python mailing list<br>
<a href="mailto:Python@py.cz">Python@py.cz</a><br>
<a href="http://www.py.cz/mailman/listinfo/python" target="_blank">http://www.py.cz/mailman/listinfo/python</a><br>
</div></div></blockquote></div><br>