abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
dnes 11:44 | Zajímavý projekt

Na Indiegogo byla spuštěna kampaň na podporu herní mini konzole a multimediálního centra RetroEngine Sigma od Doyodo. Předobjednat ji lze již od 49 dolarů. Požadovaná částka 20 000 dolarů byla překonána již 6 krát. Majitelé mini konzole si budou moci zahrát hry pro Atari VCS 2600, Sega Genesis nebo NES. Předinstalováno bude multimediální centrum Kodi.

Ladislav Hagara | Komentářů: 0
dnes 00:10 | Nová verze

Byla vydána verze 4.7 redakčního systému WordPress. Kódové označením Vaughan bylo vybráno na počest americké jazzové zpěvačky Sarah "Sassy" Vaughan. Z novinek lze zmínit například novou výchozí šablonu Twenty Seventeen, náhledy pdf souborů nebo WordPress REST API.

Ladislav Hagara | Komentářů: 0
včera 12:00 | Zajímavý projekt

Projekt Termbox umožňuje vyzkoušet si linuxové distribuce Ubuntu, Debian, Fedora, CentOS a Arch Linux ve webovém prohlížeči. Řešení je postaveno na projektu HyperContainer. Podrobnosti v často kladených dotazech (FAQ). Zdrojové kódy jsou k dispozici na GitHubu [reddit].

Ladislav Hagara | Komentářů: 14
včera 11:00 | Bezpečnostní upozornění

Byly zveřejněny informace o bezpečnostní chybě CVE-2016-8655 v Linuxu zneužitelné k lokální eskalaci práv. Chyba se dostala do linuxového jádra v srpnu 2011. V upstreamu byla opravena minulý týden [Hacker News].

Ladislav Hagara | Komentářů: 1
5.12. 22:00 | Komunita

Přibližně před měsícem bylo oznámeno, že linuxová distribuce SUSE Linux Enterprise Server (SLES) běží nově také Raspberry Pi 3 (dokumentace). Obraz verze 12 SP2 pro Raspberry Pi 3 je ke stažení zdarma. Pro registrované jsou po dobu jednoho roku zdarma také aktualizace. Dnes bylo oznámeno, že pro Raspberry Pi 3 je k dispozici také nové openSUSE Leap 42.2 (zprávička). K dispozici je hned několik obrazů.

Ladislav Hagara | Komentářů: 6
5.12. 06:00 | Zajímavý software

OMG! Ubuntu! představuje emulátor terminálu Hyper (GitHub) postavený na webových technologiích (HTML, CSS a JavaScript). V diskusi k článku je zmíněn podobný emulátor terminálu Black Screen. Hyper i Black Screen používají framework Electron, stejně jako editor Atom nebo vývojové prostředí Visual Studio Code.

Ladislav Hagara | Komentářů: 50
5.12. 06:00 | Zajímavý článek

I letos vychází řada ajťáckých adventních kalendářů. QEMU Advent Calendar 2016 přináší každý den nový obraz disku pro QEMU. Programátoři se mohou potrápit při řešení úloh z kalendáře Advent of Code 2016. Kalendáře Perl Advent Calendar 2016 a Perl 6 Advent Calendar přinášejí každý den zajímavé informace o programovacím jazyce Perl. Stranou nezůstává ani programovací jazyk Go.

Ladislav Hagara | Komentářů: 10
3.12. 16:24 | Nová verze

Byla vydána Mageia 5.1. Jedná se o první opravné vydání verze 5, jež vyšla v červnu loňského roku (zprávička). Uživatelům verze 5 nepřináší opravné vydání nic nového, samozřejmě pokud pravidelně aktualizují. Vydání obsahuje všechny aktualizace za posledního téměř půldruhého roku. Mageia 5.1 obsahuje LibreOffice 4.4.7, Linux 4.4.32, KDE4 4.14.5 nebo GNOME 3.14.3.

Ladislav Hagara | Komentářů: 17
3.12. 13:42 | Pozvánky

V Praze probíhá konference Internet a Technologie 16.2, volné pokračování jarní konference sdružení CZ.NIC. Konferenci lze sledovat online na YouTube. K dispozici je také archiv předchozích konferencí.

Ladislav Hagara | Komentářů: 0
2.12. 22:44 | Komunita

Joinup informuje, že Mnichov používá open source groupware Kolab. V srpnu byl dokončen dvouletý přechod na toto řešení. V provozu je asi 60 000 poštovních schránek. Nejenom Kolabu se věnoval Georg Greve ve své přednášce Open Source: the future for the European institutions (SlideShare) na konferenci DIGITEC 2016, jež proběhla v úterý 29. listopadu v Bruselu. Videozáznam přednášek z hlavního sálu je ke zhlédnutí na Livestreamu.

Ladislav Hagara | Komentářů: 26
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 779 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

Dotaz: Python - prace s pameti

20.8.2012 13:35 George O.
Python - prace s pameti
Přečteno: 800×
Příloha:
Zdravim, nedavno jsem tu resil parsovani html documentu, avsak jsem se dostal jakozto python zelenac do situace, kterou neumim resit, protoze presne nechapu, jak python pracuje s pameti, konkretne kopirovani obsahu vs adresy nebo aspon myslim, ze prave tohle je pricinou nespravne funkcnosti me casti kodu.

V priloze jsou dva kratke soubory a to "test.py", ktery predstavuje funkcni, ale neefektivni reseni pres n-dimenzni pole a "test2.py" reseni, ktere chci realizovat, ale je ponekud nefukcni - chovani je vysvetleno na poslednim radku v komentari:-)

Vsem moc diky za cas a pomoc:-)

PS: nemuzu vlozit vice, jak jednu prilohu, takze "test2.py" bude v reakci.

Odpovědi

20.8.2012 13:35 George O.
Rozbalit Rozbalit vše Re: Python - prace s pameti
Příloha:
Zde je test2.py
20.8.2012 16:27 l4m4
Rozbalit Rozbalit vše Re: Python - prace s pameti
Mi se to teda moc nechce číst...

Jednak tam máš problém s defaultními hodnotami argumentů, které jsou modifikovatelné typy (attrs = {}). Ta defaultní hodnota je konkrétní modifikovatelný objekt, takže zkus:
def f(x, a=[]):
    a.append(x)
    print(len(a))

f(1)
f('ble')
f(None)
Dále:

Všechno se předává referencí. Tedy všechno s čím pracuješ, jsou jména objektů, ne hodnoty.

Existují modifikovatelné a nemodifikovatelné objekty.

Nemodifikovatelné (např. čísla, stringy, None, ...) se chovají de facto jako hodnoty, ale právě jen proto, že nejdou modifikovat. Po x=1 jsou x a 1 jen jiná jména pro týž objekt. Po x+=1 bude x jméno pro jiný nemodifikovatelný objekt, nezmění se žádná hodnota x.

A u modifikovatelných je to pak samozřejmě velký rozdíl. Chceš-li kopii, použij modul copy (např.).
pavlix avatar 21.8.2012 08:26 pavlix | skóre: 53 | blog: pavlix
Rozbalit Rozbalit vše Re: Python - prace s pameti
Všechno se předává referencí. Tedy všechno s čím pracuješ, jsou jména objektů, ne hodnoty.
Technicky vzato se vše předává hodnotou, která obsahuje referenci (tedy lokální název obsahuje stejnou referenci na objekt, jako „skutečný“ parametr). Předává se tedy (reference na) objekt, ne proměnná jako taková.

Souhlasím s tím, že většina problémů bude způsobena tím, že se použije stejný měnitelný objekt, kde si programátor myslí, že se mu vytvoří nový objekt.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
rADOn avatar 20.8.2012 16:54 rADOn | skóre: 44 | blog: bloK | Praha
Rozbalit Rozbalit vše Re: Python - prace s pameti
  1. V pythonu žádné „předávání obsahu“ není. Všechno co vidíš jsou jen jména ve jmenných prostorech která jsou odkazem na nějaký objekt. I primitivní datové typy jako int jsou objekty, každé jméno které vidíš je odkaz na nějakou instanci.
  2. chyba bude asi tady:
    def __init__(self, name, parent, attrs = {})
        self.__attrs = attrs
    slovník attrs se ti zkonstruje pouze jednou v okamžiku definice té funkce, všechny instance si následně přiřadí do svého jmenného prostoru referenci na tentýž slovník. Správně se to dělá takhle:
    def __init__(self, name, parent, attrs = None)
        self.attrs = attrs if attrs is not None else {} 
  3. Pokud si chceš sestavit uzly jako strom objektů v paměti, je to už ve standartní knihovně.
  4. Rada do života jako bonus: Nepiš gettery a settery! Je to nepřehledný hnus a zbytečně to zpomaluje. (Volání metody je v pythonu relativně drahá operace.) Pokud budeš někdy v budoucnu potřebovat udělat getter nebo setter, přístup k atributu se dá zachytit pomocí @property dekorátoru. To ostatně platí obecně – pythoní kód je stručný výstižný, pokud se přistihneš že píšeš nudnou "omáčku" ve stylu Javy tak děláš něco špatně.
"2^24 comments ought to be enough for anyone" -- CmdrTaco
20.8.2012 17:05 Kit
Rozbalit Rozbalit vše Re: Python - prace s pameti
Rada do života jako bonus: Nepiš gettery a settery! Je to nepřehledný hnus a zbytečně to zpomaluje. (Volání metody je v pythonu relativně drahá operace.) Pokud budeš někdy v budoucnu potřebovat udělat getter nebo setter, přístup k atributu se dá zachytit pomocí @property dekorátoru. To ostatně platí obecně – pythoní kód je stručný výstižný, pokud se přistihneš že píšeš nudnou "omáčku" ve stylu Javy tak děláš něco špatně.
Gettery a settery jsou zločin i v Javě. Je to jasná ukázka, že dotyčný programátor neumí programovat objektově.
20.8.2012 19:34 kuka
Rozbalit Rozbalit vše Re: Python - prace s pameti
a objektove se k hodnotam atributu v jave pristupuje jak?
20.8.2012 19:44 Kit
Rozbalit Rozbalit vše Re: Python - prace s pameti
A proč bych měl přistupovat k hodnotám atributů objektu? K čemu je budu potřebovat?

Je potřeba si uvědomit, že použití getteru nebo setteru je stejně špatné jako public přístup k atributu objektu. Z objektu přece nevybíráme hodnoty atributů ani je nenastavujeme. Objektům se posílají zprávy o událostech a získávají se od nich reporty.
20.8.2012 20:20 l4m4
Rozbalit Rozbalit vše Re: Python - prace s pameti
A proč bych měl přistupovat k hodnotám atributů objektu?
Protože Python nemá POD (plain old data) schopná snadno a rychle shrnout skupinu informací do jedné ,věci`. Tudíž zbývá
# Dal jsem to do čtvrté položky, nebo do šesté?  Ale kdeže, do třetí.
struct = (1.2, -3.0, 'cx', 4, 4, 0, True, False, True)
print struct[3]

# Složitý přístup k datům máme rádi, nutí nás zamyslet se, zda je opravdu potřebujeme.
struct = {
   'alpha': 1.2, 'lambda': -3.0,
   'name': 'cx',
   'width': 4, 'height': 4, 'depth': 0,
   'normalize': True, 'recursive': False, 'fixed': True,
}
print struct['width']

# Jsem expert, tak vyrobím něco, co se dá indexovat a sčítat jako tuple, abych vás zmátl.
import collections
Struct = collections.namedtuple('Struct', bla bla bla...)
bla bla bla...

# Ecce obiectum!  Není to POD, ale je to skoro tak dobré.
class Struct:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

struct = Struct(alpha=1.2, beta=-3.0, name='cx', width=4, height=4, depth=0,
                normalize=True, recusrive=False, fixed=True)
print struct.width
Navzdory ortodoxním objektistům nechci té věci posílat zprávy, chci s ní něco udělat (viz Execution in the Kingdom of Nouns). Právě proto, aby to nevypadalo jako typická javí byrokracie.
20.8.2012 20:49 Kit
Rozbalit Rozbalit vše Re: Python - prace s pameti
A proč bych měl přistupovat k hodnotám atributů objektu?
...
print struct.width
Někdy je také dobré se zamyslet, k čemu vlastně potřebuji struct.width. Často je to zaviněno chybným návrhem objektu. Obvykle totiž samotné atributy objektu ve své podstatě nepotřebuji.
21.8.2012 08:43 l4m4
Rozbalit Rozbalit vše Re: Python - prace s pameti
Četl jsi to vůbec? Nenavrhuji žádný objekt. Při čemkoli, co v Pythonu děláš, vznikne spousta objektů, což neznamená, že je navrhuješ.
21.8.2012 10:49 Kit
Rozbalit Rozbalit vše Re: Python - prace s pameti
Nenavrhuješ objekt, ale vytváříš datovou strukturu. I když je to po technické stránce objekt, má do objektu daleko. Nic nedělá, jen uchovává data.
21.8.2012 11:37 l4m4
Rozbalit Rozbalit vše Re: Python - prace s pameti
Výborně. A to je přesně ta situace, kdy vytvářím objekt -- protože nic jiného vytvořit nejde -- jen proto, abych přistupoval k jeho datovým členům. Stejně jako pole vytvářím často proto, abych přistupoval k jeho položkám (někdy se využijí i metody pole).
21.8.2012 12:27 Kit
Rozbalit Rozbalit vše Re: Python - prace s pameti
Dobrá, máš tedy datovou strukturu. Ale kde máš metody? Plnohodnotné objekty přece obsahují datové struktury a metody, které jediné s nimi mohou pracovat. Gettery a settery mezi metody nepočítám. Jsou jen nadstavbou datové struktury, aby přímý přístup k ní nevypadal tak blbě.
23.9.2012 22:49 diverman
Rozbalit Rozbalit vše Re: Python - prace s pameti
Gettery a settery mezi metody nepočítám. Jsou jen nadstavbou datové struktury, aby přímý přístup k ní nevypadal tak blbě.
Blbost. V setteru bezne provadim vedlejsi efekty, napr. logging. Navic python pomoci property() vytvari tak dokonalou hracku, ze se to primo vybizi takto primo pristupovat k atributum objektu.
24.9.2012 06:17 Kit
Rozbalit Rozbalit vše Re: Python - prace s pameti
Už jsme si to vyjasnili jinde. Byly myšleny primitivní gettery a settery v uvedeném příkladu, které jen nahrazovaly přímý přístup k datové struktuře a nedělaly nic navíc.
pavlix avatar 25.9.2012 12:18 pavlix | skóre: 53 | blog: pavlix
Rozbalit Rozbalit vše Re: Python - prace s pameti
Byly myšleny primitivní gettery a settery v uvedeném příkladu, které jen nahrazovaly přímý přístup k datové struktuře a nedělaly nic navíc.

Což je ovšem velmi nezajímavé téma, o kterém si tu podle mě chce povídat jen jeden jediný člověk.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
pavlix avatar 21.8.2012 12:23 pavlix | skóre: 53 | blog: pavlix
Rozbalit Rozbalit vše Re: Python - prace s pameti
I když je to po technické stránce objekt, má do objektu daleko.
Ach ta terminologie :).
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
21.8.2012 09:05 kuka
Rozbalit Rozbalit vše Re: Python - prace s pameti
Aha a kdyz budeme chtit z objektu reprezentujiciho treba zamestnance ziskat jeho prijmeni, tak to udelame jak?
21.8.2012 09:40 Kit
Rozbalit Rozbalit vše Re: Python - prace s pameti
Především se zamyslím nad tím, k čemu mi bude jenom jeho příjmení a co s ním vlastně chci dělat. Objekt není jen datové skladiště, do kterého ukládám elementární údaje a zase je vybírám. Objekty toho umí mnohem víc.

Pokud budu z objektu potřebovat jen příjmení zaměstnance, tak zbývající údaje o zaměstnanci jsou zbytečné. Nepotřebuji tedy objekt, ale bude mi stačit jedna proměnná typu string, do které umístím příjmení.
21.8.2012 10:54 George O.
Rozbalit Rozbalit vše Re: Python - prace s pameti
Gettery a Settery jsou docela dobra vec, pokud clovek chce udrzet nejakou konzistenci a access policy. Soucasny priklad byl maximalne zjednoduseny, abych vyloucil zbytecne logicke chyby. Kazdopadne uz jsem si nastudoval dekoratory a docela fajnova vec to je:-)

Ale kazdopadne nic to nemeni na tom, ze se mi nedari zrealizovat klasicky seznam-like datovou strukturu - priklad:
typedef struct list {
  char *data;
  struct list *next;
} LIST;
Ja se teda snazim presneji o tohle, coz sice neni to same, ale napadne podobne:
typedef struct list {
  char *data;
  struct list *parent;
  struct list **children;
} LIST;
Ale neprisel jsem na to, jak to zrealizovat v pythonu. V PHP to bylo hned, ale v pythonu porad tapu a tapu...
21.8.2012 11:10 Kit
Rozbalit Rozbalit vše Re: Python - prace s pameti
Proč na seznam nepoužiješ strukturu seznam?
21.8.2012 12:18 George O.
Rozbalit Rozbalit vše Re: Python - prace s pameti
Protoze seznam nema reference mezi objekty nebo snad ano? :-) A jinak pokud sis vsiml, tohle byla tree struktura, ale mela podobne vlastnosti, jako seznam - to jest reference na sebe sama:-)
rADOn avatar 21.8.2012 12:44 rADOn | skóre: 44 | blog: bloK | Praha
Rozbalit Rozbalit vše Re: Python - prace s pameti
Protoze seznam nema reference mezi objekty nebo snad ano?
Který části tvrzení „v pythonu je všechno reference“ nerozumíš? :-) Sleduj lva:
In [10]: l = [1,2,3]

In [11]: l.append(l)

In [12]: l
Out[12]: [1, 2, 3, [...]]
(tři tečky jsou objekt Elipsis který značí zacyklení)
"2^24 comments ought to be enough for anyone" -- CmdrTaco
pavlix avatar 21.8.2012 12:28 pavlix | skóre: 53 | blog: pavlix
Rozbalit Rozbalit vše Re: Python - prace s pameti
Ale kazdopadne nic to nemeni na tom, ze se mi nedari zrealizovat klasicky seznam-like datovou strukturu - priklad:
typedef struct list {
  char *data;
  struct list *next;
} LIST;
Definuj „nedaří se mi“, mně totiž nenapadá, co by se ti na tom mohlo nedařit. Atribut data nastavit můžeš, atribut next jakbysmet, takže?
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
21.8.2012 12:54 George O.
Rozbalit Rozbalit vše Re: Python - prace s pameti
Odpoved najdes v "test2.py" (2. reakce, v teto diskuzi) :-)
rADOn avatar 21.8.2012 15:47 rADOn | skóre: 44 | blog: bloK | Praha
Rozbalit Rozbalit vše Re: Python - prace s pameti
Tam máš ale úplně jinou chybu.
"2^24 comments ought to be enough for anyone" -- CmdrTaco
pavlix avatar 21.8.2012 21:28 pavlix | skóre: 53 | blog: pavlix
Rozbalit Rozbalit vše Re: Python - prace s pameti
Odpoved najdes v "test2.py" (2. reakce, v teto diskuzi) :-)
Pokud nemáš zájem o pomoc, stačí to říct rovnou :).
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
21.8.2012 11:20 kuka
Rozbalit Rozbalit vše Re: Python - prace s pameti
Takze pokud na konkretnim miste systemu potrebuju zrovna jen prijmeni, tak vsechno ostatni je zbytecne? Na jinem miste muze byt potreba neco jineho. Spravny objektovy pristup by tedy spocival v tom, ze prijmeni zamestnance budu mit nekde uplne jinde nez v instanci tridy zamestnanec (kde?) v promenne typu string?
21.8.2012 11:29 Kit
Rozbalit Rozbalit vše Re: Python - prace s pameti
Je mi podivné, proč bych měl chtít z instance třídy zaměstnanec jen příjmení zaměstnance. Jiné údaje mě nezajímají? Ani osobní číslo? Vůbec nic s tím příjmením nepotřebuji dělat, jenom ho chci vytáhnout z objektu? K čemu mi pak bude, když ho na nic nepotřebuji?
21.8.2012 11:38 l4m4
Rozbalit Rozbalit vše Re: Python - prace s pameti
Chci ho vypsat na stdout. Tak.
21.8.2012 11:41 l4m4
Rozbalit Rozbalit vše Re: Python - prace s pameti
Nebo naopak: K čemu potom ten objekt drží to příjmení, když ho od něj nesmím chtít?
21.8.2012 11:53 Kit
Rozbalit Rozbalit vše Re: Python - prace s pameti
Třeba můžu po tom objektu chtít, aby to příjmení vypsal na stdout. Nebo po něm můžu chtít, aby na ten stdout vypsal celé jméno, příjmení, adresu a aby to správně naformátoval. Také po něm můžu chtít, aby mi to poslal jako string nebo strukturu.

Nelíbí se mi, když kdekdo do třídy paušálně nacpe gettery a settery na každou položku, ke které možná bude chtít přistupovat z vnějšku. Je to stejně špatné, jako použití public proměnných. Jen to vypadá jinak.
pavlix avatar 21.8.2012 12:29 pavlix | skóre: 53 | blog: pavlix
Rozbalit Rozbalit vše Re: Python - prace s pameti
Nelíbí se mi, když kdekdo do třídy paušálně nacpe gettery a settery na každou položku, ke které možná bude chtít přistupovat z vnějšku. Je to stejně špatné, jako použití public proměnných. Jen to vypadá jinak.
Nebo taky stejně správně :).
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
21.8.2012 12:40 Kit
Rozbalit Rozbalit vše Re: Python - prace s pameti
Kdybych napsal "stejně správně", tak by to možná vypadalo, jako kdybych obhajoval public proměnné. A k tomu mám hodně daleko. Objekt má být černá skříňka, která v maximální míře skrývá svou strukturu, reaguje na události a poskytuje reporty.
pavlix avatar 21.8.2012 21:29 pavlix | skóre: 53 | blog: pavlix
Rozbalit Rozbalit vše Re: Python - prace s pameti
Kdysi jsem byl taky víc filosof než programátor, ale v poslední době jsem tyhle složky osobnosti spíše vyrovnal :).
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
21.8.2012 12:39 kuka
Rozbalit Rozbalit vše Re: Python - prace s pameti
Ovsem o zadnem pausalnim cpani getteru (a uz vubec ne setteru) do tridy nebylo vubec reci, to je pouze jakasi tvoje sugesce. Jak se lisi metoda napr. getPrijmeni od "aby mi to poslal jako string"? Mne se zase nelibi, kdyz nekdo pausalne predpoklada, ze ostatni jsou blbci, a placa hovadiny jako "pouziti getteru je stejne spatne jako public pristup k atributu".
21.8.2012 13:15 Kit
Rozbalit Rozbalit vše Re: Python - prace s pameti
Pod pojmem getter chápu metodu, ve které je pouze
return this.prijmeni;
a takové metody se mi nelíbí, protože nic nedělají. Možná to chápeš jinak.

Velmi často se setkávám s tím, že v aplikaci je getter osoba.getPrijmeni(), o řádek níž osoba.getJmeno() a na dalším je jejich spojování a výstup. Proč tak složitě, když to může udělat objekt?

Se settery to bývá stejné. Nejprve vytvoření prázdného objektu, potom hromada setterů. Přitom by stačilo jedním příkazem vytvořit naplněný objekt v konstruktoru.

Další příklad. Připočtení hodnoty k atributu objektu. Běžně vídám tuto hrůzu:
objekt.setX(objekt.getX+5);
místo praktičtějšího
objekt.addX(5);
nebo
objekt.posunDoprava(5);
případně
objekt.posun(5,kurs);
21.8.2012 13:42 kuka
Rozbalit Rozbalit vše Re: Python - prace s pameti
Co bezne vidas je irelevantni a getter chapes zjednodusene (i tak ale byva konkretne v jave lepsi takovy trivialni getter nez primy pristup k promenne). Gettery a settery umoznuji pristup k properties (tzn. pochopitelne nijak nesupluji metody ala "posunDoprava"). Property muze byt cokoliv a technicky nemusi byt ve tride nijak reprezentovana. Napriklad zamestnanec muze mit property "cele jmeno", ovsem datove obsahuje zvlast jmeno a prijmeni, ktere se pro potreby ziskani celeho jmena spoji a volajicimu do toho vubec nic neni. Setter pro takovou property pak neobsahuje vubec a nemusi ho obsahovat ani pro prijmeni (to je ostatne caste, nemodifikovatelne tridy neposkytuji settery ani jine mutatory). To je prave rozdil proti primemu pristupu k instance variables - getter nebo setter muze obsahovat logiku, kontrolu pristupu, logovani... Muze byt take jednoduse obalen aspektem, coz uz je ale offtopic. Pouziti getteru je zkratka velmi objektove, protoze zakryva implementaci.
21.8.2012 13:55 Kit
Rozbalit Rozbalit vše Re: Python - prace s pameti
Dobrá. Asi jsem měl spíš použít slovní spojení "primitivní getter" a "primitivní setter", která snad lépe vystihují, co jsem měl na mysli.

Souhlasím, že objekt vůbec nemusí dané atributy obsahovat ve formě proměnných. Settery a gettery mohou například přímo komunikovat s databází.

Ovšem nevidím důvod, proč by podle tebe nemohl existovat setter setCeleJmeno("Jmeno","Prijmeni")
21.8.2012 15:07 kuka
Rozbalit Rozbalit vše Re: Python - prace s pameti
Tak ja netvrdim, ze nemuze nikdy existovat. Metodicky to ale neni ciste, protoze jestlize je property odvozena, tak se jeji hodnota jako takova nenastavuje. Pritom muze byt klidne v poradku poskytnout metodu, ktera nastavuje jmeno i prijmeni, pouze jeji "vydavani" za setter jakesi jine property je matouci, metoda by se mohla jmenovat treba changeJmenoPrijmeni. Je to spis otazka nejakych best practices pri modelovani, kde by rekneme pro trivialniho zamestnance mohly byt read-write properties jmeno a prijmeni a read-only property celeJmeno, u niz by byl popsan konkretni format (treba prijmeni uppercase, zarovnani a pripadne zkraceni krestniho jmena apod.).
21.8.2012 18:10 Kit
Rozbalit Rozbalit vše Re: Python - prace s pameti
Vzhledem k tomu, že většinou konstruktorem rovnou ukládám položku do databáze, tak už musím mít k dispozici všechny potřebné atributy, abych chybějící položky nemusel v databázi nahrazovat správným údajem. Takže pak už to ani nenazývám jako setter, ale jako konstruktor. Setterem tu položku jen modifikuji nebo mažu, ale nepřidávám.
21.8.2012 11:44 kuka
Rozbalit Rozbalit vše Re: Python - prace s pameti
Tak proc ne, at me tedy zajima prijmeni, jmeno, osobni cislo a cislo bot - na situaci to meni co?
Pavel Stárek avatar 21.8.2012 11:27 Pavel Stárek | skóre: 43 | blog: Tady bloguju já :-) | Kolín
Rozbalit Rozbalit vše Re: Python - prace s pameti
Asi tomu nerozumím. Tedy je špatně když si napíšu takovouhle třídu se kterou budu někde dále v programu pracovat?

class Zamestnanec(object):
  def __init__(self):
    self.jmeno = u""
    self.prijmeni = u""
    self.pozice = u""
Kdo chce, hledá způsob; kdo nechce, hledá důvod.
21.8.2012 11:39 Kit
Rozbalit Rozbalit vše Re: Python - prace s pameti
Připadá mi podivné vytvářet objekt třídy Zamestnanec, který nemá jméno, příjmení ani pozici. Dokonce místo nedefinovaných hodnot má nějaké prázdné řetězce. To už byl mnohem lepší konstruktor, který sem poslal l4m4.
Pavel Stárek avatar 21.8.2012 11:52 Pavel Stárek | skóre: 43 | blog: Tady bloguju já :-) | Kolín
Rozbalit Rozbalit vše Re: Python - prace s pameti
No vidím, že pán je programátor. Takže tady bude každá další diskuze zbytečná.
Kdo chce, hledá způsob; kdo nechce, hledá důvod.
21.8.2012 12:21 George O.
Rozbalit Rozbalit vše Re: Python - prace s pameti
No, treba ma jen jiny pohled na problem. Mozna mu prijde efektivnejsi hash array s externim workflow a zadnym rizenim pristupu :-D
21.8.2012 12:34 Kit
Rozbalit Rozbalit vše Re: Python - prace s pameti
Právě naopak. Gettery a settery považuji za nežádoucí externí workflow, protože nic nedělají. Pouze zpřístupňují interní proměnné objektu.
pavlix avatar 21.8.2012 12:36 pavlix | skóre: 53 | blog: pavlix
Rozbalit Rozbalit vše Re: Python - prace s pameti
Já měl vždy za to, že vznikly pro případ, že něco dělají.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
pavlix avatar 21.8.2012 12:31 pavlix | skóre: 53 | blog: pavlix
Rozbalit Rozbalit vše Re: Python - prace s pameti
Tak s tím nesmyslným prázdným zaměstnancem by se dalo celkem souhlasit, ne?
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
Pavel Stárek avatar 21.8.2012 12:40 Pavel Stárek | skóre: 43 | blog: Tady bloguju já :-) | Kolín
Rozbalit Rozbalit vše Re: Python - prace s pameti
A co když si tam ta data chci dát někdy jindy?
Kdo chce, hledá způsob; kdo nechce, hledá důvod.
pavlix avatar 23.9.2012 04:00 pavlix | skóre: 53 | blog: pavlix
Rozbalit Rozbalit vše Re: Python - prace s pameti
Je nějaký důvod, proč na to někdy jindy neodložit vytvoření toho záznamu?
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
23.9.2012 07:25 Kit
Rozbalit Rozbalit vše Re: Python - prace s pameti
Podle mne není. Obvykle je zbytečné vytvářet prázdné objekty a teprve dodatečně je plnit. V reálném životě to nikdo nedělá. Proč to zavádět v programování? Konstruktory jsou tu od toho, abychom je používali.
Pavel Stárek avatar 21.8.2012 12:53 Pavel Stárek | skóre: 43 | blog: Tady bloguju já :-) | Kolín
Rozbalit Rozbalit vše Re: Python - prace s pameti
A jen tak pro zajímavost, to není objekt, alébrž třída.
Kdo chce, hledá způsob; kdo nechce, hledá důvod.
21.8.2012 16:44 Milan Roubal | skóre: 25
Rozbalit Rozbalit vše Re: Python - prace s pameti
podle me je ten vysledek 2 soucet title + script a nikoliv head + body. Rekl bych, ze to dela ten radek odstraneni prvniho elementu.

U toho druheho prikladu jsou vsechny objekty HtmlElement jeden a ten samy objekt, proto to neudela strom.
Bystroushaak avatar 23.9.2012 00:10 Bystroushaak | skóre: 30 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: Python - prace s pameti
Jen doplním, že kdyby někdo nechtěl zabíjet čas psaním vlastního parseru, existuje BeautifulSoup, nebo můj pyDHTMLParser.
23.9.2012 19:39 George O.
Rozbalit Rozbalit vše Re: Python - prace s pameti
Anebo taky existuje http://docs.python.org/library/htmlparser.html coz je zakladni knihovna pythonu... a je spolehlivy :-)
Bystroushaak avatar 24.9.2012 14:59 Bystroushaak | skóre: 30 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: Python - prace s pameti
Jenže má jednu nevýhodu - autoři při jeho návrhu fetovali.

Pro různé spidery a celkově stránky, u kterých dopředu nemůžeš, nebo jsi moc líný namodelovat strukturu se víc hodí ty mnou odkazované.
26.9.2012 12:40 Kit
Rozbalit Rozbalit vše Re: Python - prace s pameti
Zajímalo by mě, co konkrétně je na modulu HTMLParser špatně. Podle mne je to běžné parsování metodou SAX. Každý token vyvolá nějakou událost, kterou si zpracuješ podle potřeby.
Bystroushaak avatar 26.9.2012 13:57 Bystroushaak | skóre: 30 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: Python - prace s pameti
Podle mne je to běžné parsování metodou SAX. Každý token vyvolá nějakou událost, kterou si zpracuješ podle potřeby.
To je na něm špatně.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.