De így egy osztályhierarchiánál tele lesz a kód időzített bombákkal. Mert hiszen egy saját email típust implementáló osztálynál milyen változónevek jönnek elő? Egy légbőlkapott példa:
self.mail: ezt már tuti örököltük valahonnan
self._mail: ezt talán ellőtte annak a közvetlen gyereke, ahonnan a self.mail-t örököltük
self.mymail: valaki kínjában pont ezt választhatta
self.shit: ez a leggyakoribb változónév, biztos volt már :)
...
A gond az, hogy Pythonban az attribútumok viselkedése pont olyan polimorfikus, mint a függvényeké. Sosem tudhatod, hogy hol jelent meg már egy attribútum, és mivel attribútumot létrehozni bárhol lehet a kódban, észrevenni sem igazán lehet. Sajnos a fejlesztőrendszerek sincsenek egyelőre a helyzet magaslatán ez ügyben. Az Eclipse PyDev sem jó mindenre.
A '_'-szal kapcsolatban igazad van, de a '__' megoldja a problémát, mert új, csak az adott osztályra specifikus nevet hoz létre. Tehát a Derived-ban a self.__msg egy új változó, sosem azonos a Base-beli self.__msg-vel. Szóval pont jó lenne, csak állatira ronda lesz tőle a kód.
Minden olyan attribútumhoz property-t létrehozni, amit meg akarunk védeni a gyerekosztályoktól, tényleg rossz megoldás. Főleg azért, mert a property-hez (általában) tartozni fog egy attribútum, ami a védett adatot tartalmazza. Ez vagy '__'-os, vagy pont ott vagyunk ahonnan elindultunk. A property-k sajnos nem védenek a gyerekosztály véletlen hozzáférésétől, csak a külvilágnak mondanak valamit.
Összefoglalva: a Python programozás titka, hogy a származtatott osztály implementációjakor figyeljünk rá, nehogy véletlenül az örökölt attribútumok ismeretlen halmazából válasszunk nevet. :)