Forum » Programiranje » python osnova
python osnova
![](https://static.slo-tech.com/stili/avatar_gray.gif)
detroit ::
Živjo fellow geeks eno vprašanje imam glede pythona s katerim zadnje čase nekaj praskam.
Zanima me čemu imajo eni objekti dostopne propertije npr
object.property
drugi pa
object["property"]
Rad bi se znebil uporabe ["property"], tako da hvala za vse informacije. Sem googlal pod property accessor samo najbrž niti ni pravi keyword glede na to da nisem našel nič pametnega
lp
Zanima me čemu imajo eni objekti dostopne propertije npr
object.property
drugi pa
object["property"]
Rad bi se znebil uporabe ["property"], tako da hvala za vse informacije. Sem googlal pod property accessor samo najbrž niti ni pravi keyword glede na to da nisem našel nič pametnega
lp
Skero
![](https://static.slo-tech.com/stili/avatar_gray.gif)
GupeM ::
Nisem Python expert, ampak menim, da object.property dostopa do propertyja objekta object, object["property"] pa dostopa do vrednosti, ki je shranjena pod ključem "property", sam object pa je tipa dictionary.
![](https://static.slo-tech.com/stili/avatar_gray.gif)
detroit ::
sorry moram popravit vprašanje, ko dam včasih objekt.property pravi da nima tega propertyja in moram dat objekt["property"]
lahko to razložiš kaj sm zašuštral in hvala
lahko to razložiš kaj sm zašuštral in hvala
Skero
![](https://static.slo-tech.com/stili/avatar_gray.gif)
GupeM ::
Lahko priložiš ta delček kode (kako je objekt definiran, in kako dostopaš do propertyja) in točno napako ki ti jo izpiše?
![](https://static.slo-tech.com/stili/avatar_gray.gif)
detroit ::
sm na telefonu:) sicer pa javi da dictionary nima tega proeprtija se mi zdi. Po moje to pove vse, da narobe delam objekte, samo google mi se ni pomagal:p
Skero
![](https://static.slo-tech.com/stili/avatar_gray.gif)
GupeM ::
Potem je težava točno to, kar sem ti napisal v prvem odgovoru.
Če dostopaš do nekega propertyja z object.property1, to pomeni da dostopaš do točno določenega propertyja v objektu object. Katerega tipa je ta object, nima veze, pomembno pa je, da ima property z imenom property1.
Ti pa bi rad dostopal do vrednosti, ki je shranjena pod nekim ključem v objektu tipa dictionary. Preberi si kaj o dictionaryjih v pythonu (podobno kot Map v Javi). Ko pa boš pokazal tisti del kode, pa ti bom lahko bolj točno povedal kaj delaš narobe. Verjetno narediš dictionary, namesto objekta ki ga rabiš.
Če dostopaš do nekega propertyja z object.property1, to pomeni da dostopaš do točno določenega propertyja v objektu object. Katerega tipa je ta object, nima veze, pomembno pa je, da ima property z imenom property1.
Ti pa bi rad dostopal do vrednosti, ki je shranjena pod nekim ključem v objektu tipa dictionary. Preberi si kaj o dictionaryjih v pythonu (podobno kot Map v Javi). Ko pa boš pokazal tisti del kode, pa ti bom lahko bolj točno povedal kaj delaš narobe. Verjetno narediš dictionary, namesto objekta ki ga rabiš.
![](https://static.slo-tech.com/stili/avatar_gray.gif)
detroit ::
Mislim da se zadeve lotim takole
test = {'barva': 'rdeča', starost: 20 }
očitno je to dict, kako se potem naredi objekt z new?
kar pomeni da moram imeti class ipd
test = {'barva': 'rdeča', starost: 20 }
očitno je to dict, kako se potem naredi objekt z new?
kar pomeni da moram imeti class ipd
Skero
Zgodovina sprememb…
- spremenil: detroit ()
![](https://static.slo-tech.com/stili/avatar_gray.gif)
ragezor ::
priporocam, da uvedes pythonu primerno terminologijo. property je nekaj posebnega v pythonu. ti hoces dostopati do atributa nekega objekta
v pythonu so vse stvari objekt in jim lahko poljubno dodajas atribute. vendar pazi, built-in tipi imajo onemogoceno dinamicno dodajanje atributov.
en built-in tip je dictionary. ustvaris ga z {'kljuc': 'vrednost'} ali dict(kljuc='vrednost'). dictionary je namenjen shranjevanju parov kljuc - vrednost.
z [] sintakso dostopas do kljuca. lahko pa tudi poklices dictionary.get('kljuc')
malo se poigraj z interpreterjem:
v pythonu ustvarjas svoje classe tako:
v pythonu so vse stvari objekt in jim lahko poljubno dodajas atribute. vendar pazi, built-in tipi imajo onemogoceno dinamicno dodajanje atributov.
en built-in tip je dictionary. ustvaris ga z {'kljuc': 'vrednost'} ali dict(kljuc='vrednost'). dictionary je namenjen shranjevanju parov kljuc - vrednost.
z [] sintakso dostopas do kljuca. lahko pa tudi poklices dictionary.get('kljuc')
malo se poigraj z interpreterjem:
>>> d = {'kljuc': 42} >>> d.kljuc Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'dict' object has no attribute 'kljuc' >>> d.kljuc = 'test' Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'dict' object has no attribute 'kljuc' >>> d['kljuc'] 42 >>> d.__getitem__('kljuc') 42 >>> class MojObjekt(object): ... def __getitem__(self, x): ... print 'klices getitem' ... >>> o = MojObjekt() >>> o.kljuc Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'MojObjekt' object has no attribute 'kljuc' >>> o.kljuc = 42 >>> o.kljuc 42 >>> o['kljuc'] klices getitem >>>
v pythonu ustvarjas svoje classe tako:
class MojObjekt(object): def __init__(self, x): self.x = x # class instanciras tako o = MojObjekt('testni objekt') print o.x
Zgodovina sprememb…
- spremenil: ragezor ()
![](https://static.slo-tech.com/stili/avatar_gray.gif)
detroit ::
Hvala bom malo bolj detajlno prebral ko pridem domov.
Imam pa še eno vprašanje, če imam mutiple inheritance v igri c inherita b, ki inherita a. In vsi imajo funkcijo test(), kako bi klical iz cja originalno funkcijo.
Z npr c.test() se bo klical potem še b.test() in še a.test() (ker imam tudi chainan super v funkcijah). Torej kako bi klical c.test() samo a.test()
namest b.test() in še a.test()
Hvala še enkrat
lp
Imam pa še eno vprašanje, če imam mutiple inheritance v igri c inherita b, ki inherita a. In vsi imajo funkcijo test(), kako bi klical iz cja originalno funkcijo.
Z npr c.test() se bo klical potem še b.test() in še a.test() (ker imam tudi chainan super v funkcijah). Torej kako bi klical c.test() samo a.test()
namest b.test() in še a.test()
Hvala še enkrat
lp
Skero
![](https://static.slo-tech.com/stili/avatar_gray.gif)
ragezor ::
kako bi to naredil v katerem drugem jeziku?
btw multiple inheritance je izraz, ko C deduje od A in B ( class C(A, B) ) in ne v verigi.
btw multiple inheritance je izraz, ko C deduje od A in B ( class C(A, B) ) in ne v verigi.
![](https://static.slo-tech.com/stili/avatar_gray.gif)
detroit ::
Veš da mi zdele na pamet ne pade kako bi za drug jezik naredil. Sem pa malce sem pogledal za python in sem zgooglal MRO (method resolution order) ampak nekako nisem dobil odgovora.
imam tako
order(class1):
def test()
order(class1):
def test()
order(class1):
def test()
Jap vsi so istega imena (tak sistem inheritanca je), zato je tudi malce nerodno točno določenega zahtevat.
imam tako
order(class1):
def test()
order(class1):
def test()
order(class1):
def test()
Jap vsi so istega imena (tak sistem inheritanca je), zato je tudi malce nerodno točno določenega zahtevat.
Skero
![](https://static.slo-tech.com/stili/avatar_gray.gif)
Jakkob ::
Hvala bom malo bolj detajlno prebral ko pridem domov.
Imam pa še eno vprašanje, če imam mutiple inheritance v igri c inherita b, ki inherita a. In vsi imajo funkcijo test(), kako bi klical iz cja originalno funkcijo.
Z npr c.test() se bo klical potem še b.test() in še a.test() (ker imam tudi chainan super v funkcijah). Torej kako bi klical c.test() samo a.test()
namest b.test() in še a.test()
Hvala še enkrat
lp
http://stackoverflow.com/questions/3810...
![](https://static.slo-tech.com/stili/avatar_gray.gif)
detroit ::
Hej Jakkob, problem se pojavi ker je malce drugačn tip inheritanca, neka čudna zadeve v openerpju, kjer so vsi classi poimenovani isto (oziroma imajo field/property _inherit kjer nakažeš originalni class). MRO se malce drugače odvija tu. V smislu LIFO. Torej naredimo instanco klasa order recimo mu o.
kličemo o.test(), kateri ima poleg svoje kode še super(), ta super kliče po LIFO principu cež celo verigo.
kličemo o.test(), kateri ima poleg svoje kode še super(), ta super kliče po LIFO principu cež celo verigo.
Skero
![](https://static.slo-tech.com/stili/avatar_gray.gif)
ragezor ::
detroit vzami si 5 min casa in lepo razumljivo napisi svoj problem in vprasanja, ker tole ne vodi nikamor
![](https://static.slo-tech.com/stili/avatar_gray.gif)
detroit ::
detroit vzami si 5 min casa in lepo razumljivo napisi svoj problem in vprasanja, ker tole ne vodi nikamor
Uporabljam Odoo, v modulu a razširjam class order, v modulu b razširjam class order. V obeh sta funkciji test(), od katerih vsaka kliče super(). Sedaj če kličem funkcijo order.test() se kliče sprva b, nato (zaradi super) a.test(), ki posledično zaradi super kliče originalno funkcijo order.test. Kako bi klical torej originalno funkcijo že v osnovi.
Upam da je to kaj bolj razumljivo.
Vsem pa res hvala!
Skero
![](https://static.slo-tech.com/stili/avatar_gray.gif)
OrkAA ::
To je spet napisano popolnoma nelogicno, vsaj kakor jaz razumem. Zakaj enostavno ne napises neke skrajsane replike kode na kateri delas? Nekaj kar lahko sami pozenemo in vidimo error, oziroma ti ze takoj povemo v cem je problem.
![](https://static.slo-tech.com/stili/avatar_gray.gif)
detroit ::
Ker trenutno imam samo remote dostop do virtualke copy/paste ne dela.
Ni kaj razumeti, po moje je problem bolj nepoznavanje Odoo okolja.
Evo imam več modulov vsak od teh ima class pos_order, ter funkcijo test, vsi imajo doSomething ki naredi pač nekaj.
Inheritance modulov deluje tako namestiš modul A, in potem modul B (z zgoraj omenjenim funkcijam) in se izvedejo prvič B.test ki kliče s super A.test, ki kliče s super originalclass.test. Taka je pač logika, ne vem pa če je to čisto po pythonovsko.
Ni kaj razumeti, po moje je problem bolj nepoznavanje Odoo okolja.
class pos_order(models.Model): def test(self, cr, uid, orders, context=None): super(pos_order, self).create_from_ui(cr, uid, orders, context=context) doSomething()
Evo imam več modulov vsak od teh ima class pos_order, ter funkcijo test, vsi imajo doSomething ki naredi pač nekaj.
Inheritance modulov deluje tako namestiš modul A, in potem modul B (z zgoraj omenjenim funkcijam) in se izvedejo prvič B.test ki kliče s super A.test, ki kliče s super originalclass.test. Taka je pač logika, ne vem pa če je to čisto po pythonovsko.
Skero
Zgodovina sprememb…
- spremenil: detroit ()
![](https://static.slo-tech.com/stili/avatar_gray.gif)
OrkAA ::
class osnovni(object): def krneki(self): print 'osnovni' class a(osnovni): def krneki(self): super(a, self).krneki() print 'a' class b(a): def krneki(self): super(b, self).krneki() print 'b' osnovni.krneki(self) instanca = b() instanca.krneki() Izpis: ----------------------------------- orkaa$ python slotech.py osnovni <--- to izpise osnovni class, ko ga poklice class a, ko ga poklice class b. a <--- to izpise class a, ko ga poklice class b. b <--- to izpise class b direktno. osnovni <--- to izpise osnovni class, ko ga je b poklice direktno, brez super.
Ti to odgovori na vprasanje?
Zgodovina sprememb…
- spremenil: OrkAA ()
![](https://static.slo-tech.com/stili/avatar_gray.gif)
detroit ::
Ojla OrkAA osnova MRO mi je zdaj nekako jasna samo mislim da je tukaj problem preveč specifičen in bi ti moral poznati Odoo da bi mi lahko naprej pomagal, za enkrat hvala vsem ste odgovorili na vprašanja. Sedaj je na meni da raziščem kako to deluje v Odooju.
Skero
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Težava pri pogoju razredu [Python]Oddelek: Programiranje | 783 (577) | wungad |
» | Razlika med oklepaji in vprašanja o sintaksiOddelek: Programiranje | 1606 (909) | Rias Gremory |
» | Python, prosim za pomoc pri programiranju (strani: 1 2 3 )Oddelek: Programiranje | 13734 (9836) | lenika |
» | [c++] standardni c++ in dogodki(events)Oddelek: Programiranje | 1718 (1543) | yeti |
» | [python] prednosti in slabostiOddelek: Programiranje | 2540 (2116) | Gundolf |