Muzete prosim specifikovat, co dle Vas znamena "plne objektovy"? Dle poucek se za zakladni vlastnosti objektoveho systemu povazuje: skladani (composition), polymorfismus (polymorphism) a zapouzdreni (encapsulation). Nekdy se jeste pridava dedicnost (inheritance). Vsechny tyto vlastnosti Python ma (pomineme-li, ze zapouzdreni je dano jen konvenci). Co mu tedy chybi? Je pravda, ze Python nema explicitni system typu (relace subtype/supertype), ovsem typove systemy mohou byt ortogonalni k objektovym vlastnostem jazyka.
Pre mna ako cloveka, co mal tu cest sa oboznamit so SmallTalk-om, je kazdy iny "objektovo-orientovany" jazyk menej "objektovy" ako Smalltalk. Preco?
V Smalltalku je vsetko objekt. (Okrem tych veci, co su metody :)
Teda nie je tam klucove slovo if, for, ani "{" a "}".(while, ...)
Ako sa bez toho zaobidu?
Jednoducho.(mozno to tak v mojom podani nebude vyzerat, ale je to len otazka zvyku.)
Ked sa zavola nejaka metoda objektu, teda "posle sa mu message", tak sa vykona telo tej metody, a vrati sa nejaky objekt.
Napriklad: 3>5
Objektu (reprezentujucemu cislo)3 sme poslali message > s parametrom 5.
Vysledkom je singleton objekt triedy False - podtriedy triedy Boolean.
Jemu( objektu False) mozeme zasa poslat dalsi message(zavolat funkciu) - napriklad:
False ifTrue: aBlock
kde aBlock je nejaky objekt triedy Block = vytvori ho kompilator zo sady prikazov nachadzajucich sa medzi "[" a "]" (je to vlastne nahrada zlozeneho prikazu v C/C++/Jave = "{bla;bla;}" )
Toto cele bol vlastne priklad na if:
Smalltalk:
3>5 ifTrue: aBlock
C/C++/Java:
if(3>5){
aBlock;//teda tu by bolo viac prikazov za sebou - napriklad 20, jeden, alebo ziadny :)
}
Este priklad na for cyklus:
C/C++:
int sum = 0;
for(int i=1;i<=10;i++){
sum+=i;
}
return sum;
Smalltalk:
|sum|
sum=0
1 to: 10 do: [each| sum=sum+each]
^sum
Vlastne ten priklad na for je nakoniec takmer metoda(funkcia):
|sum| - zadeklarovali sme si pomocnu premennu sum
sum = 0 - nastavili sme jej pociatocnu hodnotu
1 to: 10 do: [each| sum=sum+each]
objektu 1 sme poslali message to:do: s dvomi parametrami: 10 a [each| sum=sum+each]
(v C++ by to vyzeralo asi takto:
Integer::todo(Integer* a,Block* aBlock){
//a tu by bol nejaky kod
}
//a takto by sa to mozno volalo
Integer a = new Integer(1);
a->todo(10,new Block("[each| sum=sum+each]"))
)
Este vysvetlenie toho bloku:[each| sum=sum+each]
each je docasna premenna, ktora by mala postupne nadobudat hodnoty 1 az 10, jej hodnotu pripocitavame k sum
^sum - tento prikaz znamena "return sum"
Zaver: toto bolo len vysvetlenie(aspon dufam) "cistej objektovosti" Smalltalku, co sa tyka rezervovanych slov.
Krasa Smalltalku sa vsak naplno prejavuje ked sa pracuje s cislami - Integer, Double, velke cisla - vsetky su podtriedami Number, a deju sa tam pekne konverzie - su tam totiz aj zlomky :) (cize napr.sa da spolahlivo porovnavat double a double - nie ako v C/C++/Jave.)
Navyse vsetko(?) v systeme sa da zmenit, ak sa nam nieco nepaci :), nie su tam typy, ....
P.S. Prepacte, ze je to take dlhe, a mozno miestami trochu nepresne - uz 5 rokov som v Smalltalku nic neurobil, a ani predtym to nebolo nic moc, ale mam ho rad.
P.S.2: Ten nadpis(Java je ...) som pocul od pana M.L. asi tak pred piatimi rokmi :) Napriek tomu teraz programujem v Jave :(
Docela poucny prispevek. Se Smalltalkem jsem do styku neprisel, ale jeden cas jsem se ucil Objective-C a to bylo (tedy alespon si myslim) inspirovano Smalltalkem. Zajimave by bylo, kdyby nekdo o nem napasl serialek.
Frazi "Python je plne objektovy jazyk" jsem nepouzil jen kvuli tomu, aby se neozyvali lide, kteri si mysli, ze tomu tak neni.
PS: Prominte delsi odezvu, ale cely minuly tyden jsem se nedostal na inet.
> Python nepoužívá žádného zkráceného zápisu pro
> přístup k instančním atributům, vždy se musí používat
> zápisu self.atribut (viz řádek (4) v definici třídy
> pes).
nenapsal jste o atributu __dict__ (lokalni jmenny prostor tridy ulozeny ve slovniku), ktery uspesne pouzivam pri formatovani retezcu, napr:
>>> print 'barva srsti: %(barva)s, delka srsti: %(delka)s' % punta.__dict__
barva srsti: hneda, delka srsti: 4
stejnym zpusobem jej lze pouzit i v metode tridy pomoci volani self.__dict__