Python/Viskas yra objektas
Jei netyčia praleidote, sakiau, kad Python funkcijos turi atributus ir kad tie atributai pasiekiami programos vykdymo metu.
Funkcija, kaip ir visa kita Python kalboje, yra objektas.
Pasileiskite savo mėgiamą Python teksto redaktorių ar IDE ir sekite kartu:
Pavyzdys 2.3. Priėjimas prie funkcijos buildConnectionString dokumentavimo eilutės
>>> import odbchelper (1) >>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"} >>> print odbchelper.buildConnectionString(params) (2) server=mpilgrim;uid=sa;database=master;pwd=secret >>> print odbchelper.buildConnectionString.__doc__ (3) Build a connection string from a dictionary Returns string.
(1) Pirmoji eilutė įtrauks `odbchelper` programą kaip modulį – kodo gabalą, kurį galėsite naudoti interaktyvioje Python konsolėje arba kitoje, didesnėje programoje. (Skyriuje Savistabos galia, pamatysite daugia-modulinių Python programų pavyzdžių.) Po modulio įtraukimo galite galite naudoti visas to modulio viešai prieinamas funkcijas, klases ar atributus. Lygiai taip pat, vieni moduliai gali naudoti kitų modulių teikiamą funkcionalumą. Tai labai svarbus aspektas, apie kurį dar kalbėsime vėliau.
(2) Jei norite iškviesti funkcijas iš įtrauktų modulių, prieš funkcijos pavadinimą turite įrašyti modulio pavadinimą. Negalim kreiptis tiesiog į `buildConnectionString`, turite kreiptis per modulį: `odbchelper.buildConnectionString`. Jei teko naudoti klases Java kalboje, su tokia kreipimosi į funkcijas forma, turėtumėte būti šiek tiek pažįstami.
(3) Vietoje to, kad kreipčiausi į funkciją taip kaip tikėjotės, paprasčiausiai užklausiau jos atributo __doc__.
- `import`, Python kalboje yra kažkas panašaus į `require`, Perl kalboje. Po Python modulio įtraukimo su `import`, galite kreiptis į to modulio funkciją tokia forma: `modulis.funkcijas`. Po Perl modulio įtraukimo su `require`, galite kreiptis į to modulio funkciją tokia forma: `modulis::funkcijas`.
import paieškos kelias
[keisti]Prieš keliaujant toliau, norėčiau užsiminti apie modulių bibliotekos paieškos kelius. Bandant įtraukti modulį, Python jų ieško keliose skirtingose vietose. Jei tiksliau, ieškoma visuose kataloguose iš `sys.path` masyvo. `sys.path` yra paprasčiausias sąrašas, kurį paprastai galite peržiūrėti ar keisti su standartiniais sąrašo metodais.
(Daugiau apie sąrašus sužinosite vėliau, šiame skyriuje.)
Pavyzdys 2.4. import paieškos kelias
>>> import sys (1) >>> sys.path (2) ['', '/usr/local/lib/python2.2', '/usr/local/lib/python2.2/plat-linux2', '/usr/local/lib/python2.2/lib-dynload', '/usr/local/lib/python2.2/site-packages', '/usr/local/lib/python2.2/site-packages/PIL', '/usr/local/lib/python2.2/site-packages/piddle'] >>> sys (3) <module 'sys' (built-in)> >>> sys.path.append('/mano/naujas/kelias') (4)
(1) Po `sys` modulio įtraukimo galime pasiekti visas jo funkcijas ir atributus.
(2) `sys.path` yra sąrašas su katalogų pavadinimais, kurie ir sudaro esamą modulių paieškos kelią. (Taviškis tikriausiai atrodo kitaip, tai priklauso nuo tavo naudojamos operacinės sistemos, Python versijos ir kokiame kataloge jis įdiegtas.) Modulio įtraukimo metu, visuose šiuose kataloguose, tiksliai tokia pačia tvarka, Python ieškos failų su .py galūne, kurių pavadinimai atitinka jūsų bandomo įtraukti, modulio pavadinimą.
(3) Tiesą sakant pamelavau :) Realiai visa tai yra kiek sudėtingiau, todėl, kad ne visi moduliai yra išsaugoti kaip failai su .py galūne. Kai kurie, tokie kaip `sys` modulis, yra taip vadinami „build-in“ moduliai. Tokio tipo moduliai yra tiesiogiai įklijuoti į patį Python. „build-in“ moduliai veikia lygiai taip pat, kaip ir paprasti, tačiau negalime peržiūrėti jų Python kodo, todėl, kad jie nėra parašyti Python kalba! (`sys` modulis yra parašytas C programavimo kalba.)
(4) Galite pridėti naują katalogą, prie Python modulių paieškos kelio, programos vykdymo metu. Tam paprasčiausiai reikia į `sys.path` sąrašą įtraukti naują katalogo pavadinimą ir nuo to momento, Python ieškos modulių ir naujai įtrauktame kataloge. Toks įtraukimas veiks tik tol, kol bus vykdoma programa. (Apie naujų elementų įtraukimą į sąrašą kalbėsime kiek vėliau, skyriuje duomenų tipai.)
Kas yra objektas?
[keisti]Python kalboje, viskas yra objektas ir beveik viskas turi atributus ir metodus. Visos funkcijos turi automatiškai įmontuotą atributą __doc__, kuris grąžina dokumentavimo eilutę, aprašytą funkcijos kode. Modulis `sys`, taip pat yra objektas (neskaitant kitų jo savybių), kuris turi atributą `path`. Ir taip toliau.
Tačiau vis tiek iškyla klausimas. Kas yra objektas? Skirtingos programavimo kalbos „objektus“ apibrėžia skirtingai. Kai kuriose iš jų, objektai privalo turėti atributus ir metodus, kitose laikoma, kad visi objektai privalomai gali turėti išvestinius objektus. Python kalboje objekto apibrėžimas yra paprastesnis, kai kurie objektai neturi nei atributų, nei metodų (daugiau apie tai, skyriuje duomenų tipai), ir ne visi objektai gali turėti išvestinius objektus (daugiau apie tai, skyriuje objektai ir objektiškai orientuotas). Tačiau viskas yra objektas su ta mintimi, kad viską galima priskirti kintamajam ar ar perduoti kaip funkcijos argumentą (daugiau apie tai, skyriuje savistabos galia).
Tai yra taip svarbu, kad pakartosiu dar kartą, jei netyčia praleidote pirmuosius kelis sykius: Python programavimo kalboje viskas yra objektas. Simbolių eilutės yra objektai. Sąrašai yra objektai. Funkcijos yra objektai. Net gi moduliai yra objektai.
Daugiau informacijos apie objektus
- Python charakteristikos vadovėlis paaiškins labai tiksliai ką reiškia tai, kad viskas Python kalboje yra objektas, kai kurie žmonės yra pedantai ir mėgsta aptarinėti panašius dalykus labai ilgai.
- eff-bot Python objektų apibendrinimas.