isinstance - ne használjam?
Lehet, hogy a hiányos angolom miatt, de nem teljesen világos amit itt ír a szerző az isinstance használatáról.
Ahogy elnézem, ő többé-kevésbé általánosságban, programnyelvtől függetlenül próbálja megfogalmazni, miért ártalmas(???) az isinstance használata, de van egy szakasz amit nem értek: annak megállapítására, hogy egy paraméterként kapott objektum implementált-e egy szükséges interface-t ("to determine whether an object supports a particular interface "), szerinte alkalmatlan és kerülendő az isinstance használata, ugyanakkor nem látom, hogy adna tippet, hogy mit kellene helyette.
A saját problémám: pythonban készítettem egy fa struktúra leírására használható osztályt. (csak tanulgatok, semmi komoly)
Néhány helyen szeretném ellenőrizni, hogy a paraméterként kapott objektum az általam definiált Node osztályból származik-e, ezzel biztosítva, hogy a szükséges attribútumok és metódusok létezzenek benne.
Ha a fentieket jól értelmezem, e célra nem illik ezt használni. De ha ez így van(így van??), akkor hogyan tudnám ellenőrizni?
■ Ahogy elnézem, ő többé-kevésbé általánosságban, programnyelvtől függetlenül próbálja megfogalmazni, miért ártalmas(???) az isinstance használata, de van egy szakasz amit nem értek: annak megállapítására, hogy egy paraméterként kapott objektum implementált-e egy szükséges interface-t ("to determine whether an object supports a particular interface "), szerinte alkalmatlan és kerülendő az isinstance használata, ugyanakkor nem látom, hogy adna tippet, hogy mit kellene helyette.
A saját problémám: pythonban készítettem egy fa struktúra leírására használható osztályt. (csak tanulgatok, semmi komoly)
Néhány helyen szeretném ellenőrizni, hogy a paraméterként kapott objektum az általam definiált Node osztályból származik-e, ezzel biztosítva, hogy a szükséges attribútumok és metódusok létezzenek benne.
Ha a fentieket jól értelmezem, e célra nem illik ezt használni. De ha ez így van(így van??), akkor hogyan tudnám ellenőrizni?
getattr()
Ezzel nekem egy bajom van...
Viszont a python a többszörös öröklődéssel végeredményben ki tudja váltani azt, amire pl. a java interface szolgál ismereteim szerint (sőt...)
Így az én elképzelésem szerint az isinstance, ha megfelelő osztályra kérdezek rá, akkor jó lenne...
[colorer]
class Node(object):
...
if not isinstance(pnode,Node):
raise TypeError("Hibás param...")
...
class A(OsOsztaly,Node):
...
[/colorer]
De ha jól értem a linkelt oldalt, akkor ez nem igazán ajánlatos, bár én nem látom benne a probléma lehetőségét, ha jól választom ki az isinstance paramétereit.
Kicsit elbizonytalanodtam, hogy valamit nem fogok fel...
felesleges
De ha valami olyan metodust hivsz, ami nem letezik, az ugyis dob egy AttributeError-t, tehat szinte feleslegesen vizsgaltad meg, valoszinuleg nem direkt kapott a fuggveny rossz parametert, igy - hacsak nem csinalsz a metodushivas elott valami szamitasigenyes dolgot - akkor hibajelzesnek jo ez is.
Es szerintem felesleges vizsgalni, hogy az adott objektum teljes egeszeben megvalositja-e az interface-t, ha csak egy-ket dolgot hasznalsz belole. Ez pythonban elegge bevett dolog, igy vannak "definialva" az iteratorok, descriptorok, es sok minden mas. Ha van az objektumodnak
__iter__
metodusa, akkor az egy olyan container, ami tamogatja az iteralast - de ha megsem, esfor
-ral vegig szeretnel rajta menni, akkor valami hiba keletkezik.Azért kerülendő, mert később
Egyre kevésbé értem...
Azzal, hogy ellenőrzöm: a paraméterként kapott objektum valóban abból az osztályból származik-e, amiből várom, miért teszem nehézkessé a későbbi bővítést? (leszámítva azt az esetet, ha átnevezném az osztályt, ami SZVSZ nem túl egészséges dolog)
Egészen konkrétan a típusellenőrzés "tiltása" az, ami zavar az eredeti cikkben. Hiszen a java jellegű nyelvek ezt már fordításkor megteszik. Akkor ők is megsértik ezeket az elveket?
PHP-ben van typehint,
Az PHP... :)
Az egyebek nagy részét nem vitatom, tényleg zűrössé teheti a kódot, de az általam vázolt eset kivételével nem is jutna eszembe használni.
A kettő szerintem nem
Az eseménykezelőt én jó dolognak tartom, mert project szinten teszi lehetővé a változtatásokat (van aki nem szeretne levelet küldeni az új regisztráltnak sem). Tehát az ötlethez ragaszkodnék, még ha egy jobb megoldásnak esetleg jobban örülnék. :-)
feature checking
instanceof
-fal osztaly vizsgalatot. De attol meg el tudom kepzelni, hogy letezik olyan korulmeny, ahol a legegyszerubb azinstanceof
hasznalata, azzal azonban egyetertek, hogy ha valaki surun hasznalja, az lehet, hogy mashogy gondolkodik, mint ahogy abban az adott nyelvben szokas.