Second Opinion
Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale. Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit. www.neurohope.ro |
[PYTHON] Class in class
Last Updated: May 24 2015 18:27, Started by
Konatau
, May 24 2015 03:00
·
0
#1
Posted 24 May 2015 - 03:00
Se poate ca unei variabile dintr-o clasa sa-i fie atribuita o alta variabila?
Exemplu: class Alb(): def __init__(self): self.var1 = "" self.var2 = "" self.var3 = "" class Negru(): def __init__(self): self.varA = "" self.varB = "" self.varC = "" Culoare = Alb() Culoare.var1 = Negru() |
#2
Posted 24 May 2015 - 08:31
Se poate, dar in exemplul tau, nu e nevoie.
Clasele sunt lucruri abstracte, iar obiectele pe care le construiesti sunt concretizari ale conceptului abstract pe care il reprezinta acea clasa. In exemplul tau, notiunea de culoare e abstracta, si "alb" respectiv "negru" ar trebui sa fie concretizari (instante) ale acestui concept. Insa tu ai creat pe dos clasele si obiectele: concretizarile sunt clase, si abstractizarea e concretizare. Daca ai crea corect structura, problema ar dispare. Asa: class Owner: def __init__(self, name): self.name = name def __str__(self): return self.name class Color: def __init__(self, name, owner): self.name = name self.owner = owner def __str__(self): return self.name def print_color_message(color): print("culoarea " + str(color.owner) + "ului este " + str(color)) om = Owner("om") cal = Owner("cal") alb = Color("alb", cal) negru = Color("negru", om) print_color_message(alb) print_color_message(negru) Cand lucrezi cu obiecte, trebuie sa te gandesti la "grand scheme of things". Daca iti organizezi codul asa, lucrurile se aseaza mult mai bine per total, pentru ca per total nu vei avea o singura clasa si un singur obiect, ci mai multe din fiecare. In plus, strict ce vrei tu este o practica proasta: se numeste "static class property". E o practica proasta sa manipulezi clasele. Gandeste-te pentru un moment ce fel de programare faci: orientata pe obiecte, nu orientata pe clase. Deci tu trebuie sa lucrezi cu obiecte, nu cu clase, atunci cand executi cod. Evita static cu orice pret. Cand crezi ca ai nevoie de static, cel mai probabil ai un neajuns in felul in care ai structurat (modelat) conceptele (clasele). Mai bine adresezi acel neajuns direct, decat sa folosesti static. Tema: si in exemplul pe care ti l-am dat este o greseala de modelare OOP: nu o culoare ar trebui sa detina (self.owner = owner) un owner, ci owner ar trebui sa detina cate o culoare. Astfel, vei putea refolosi instantieri ale Color in mai multe obiecte Owner. Modifica codul astfel incat sa respecti acest principiu, fara ca outputul sa se schimbe. Procedura asta se numeste refactoring: cand ai modelat gresit, si corectezi, fara a schimba functionalitatea vazuta din afara. Edited by OriginalCopy, 24 May 2015 - 08:23. |
#3
Posted 24 May 2015 - 17:12
Am facut o greseala cand am formulat intrebarea, intrebarea trebuia sa fie: se poate ca unei variabile dintr-o clasa sa-i fie atribuita o alta clasa?
Un alt exemplu: class Om(): def __init__(self): self.rasa = "" self.profesie = "" class Alb(): def __init__(self): self.inaltime = 175 self.greutate = 80 class Negru(): def __init__(self): self.inaltime = 185 self.greutate = 83 class Galben(): def __init__(self): self.inaltime = 170 self.greutate = 70 class Muncitor(): def __init__(self): self.program = 10 self.salariu = 1000 class Contabil(): def __init__(self): self.program = 12 self.salariu = 6000 class Director(): def __init_(self): self.program = 8 self.salariu = 12000 Mihai = Om() Mihai.rasa = Alb() Mihai.profesie = Contabil() Jamal = Om() Jamal.rasa = Negru() Jamal.profesie = Muncitor() Lee = Om() Lee.rasa = Galben() Lee.profesie = Director() Edited by Konatau, 24 May 2015 - 17:13. |
#4
Posted 24 May 2015 - 18:27
Konatau, on 24 mai 2015 - 17:12, said:
Am facut o greseala cand am formulat intrebarea, intrebarea trebuia sa fie: se poate ca unei variabile dintr-o clasa sa-i fie atribuita o alta clasa? Nu modifica clasele, modifica obiectele. O clasa e un plan de constructie, iar pe baza unui plan de constructie poti construi mai multe obiecte de acelasi tip. Daca modifici planul de constructie insusi, obiectele pe care le construiesti in urma modificarii planului nu vor mai fi compatibile cu obiectele construite inainte de modificarea planului. Astfel violezi cele mai importante principii din programarea orientata pe obiecte. Intelegi? Cat despre ce-mi arati tu acolo, nu este "class in class", ci "object in object". Exemplul tau respecta principiile OOP in aceasta privinta. Si mai bine ar fi sa accepti rasa si profesie ca parametri in constructor. De ce? Un alt principiu important in OOP este ca un obiect sa nu fie niciodata intr-o stare invalida. Daca logica aplicatiei spune ca "Un Om are mereu o rasa si o profesie", atunci trebuie sa fortezi codul-client (codul care foloseste clasele tale) sa respecte mereu aceasta logica. Iar acest lucru il faci in timpul constructiei obiectelor, nu dupa, cum o faci momentan in exemplul tau. Deci intrebarea pe care voiai s-o pui nu este: Konatau, on 24 mai 2015 - 03:00, said:
Se poate ca unei variabile dintr-o clasa sa-i fie atribuita o alta variabila? Konatau, on 24 mai 2015 - 03:00, said:
Se poate ca unei variabile dintr-un obiect sa-i fie atribuita o alta variabila? Edited by OriginalCopy, 24 May 2015 - 18:24. |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users