Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
O smecherie pe care nu o inteleg

Balcon parter fara acte

unde gasesc un speed bag in bucur...

Programe TV cu altfel de sporturi
 Laptop "bun la toate" max...

ctfmon.exe - System Error (in Saf...

Ați prins vremurile cand 120 Volț...

Whatsapp nu afișeaza numele ...
 Medii admitere Politehnica Bucure...

Se extinde Baza de la Kogalniceanu

Politist mutilat de caine in curt...

Trotineta- cat rezista?
 Windows 11 si inregistrare de pe ...

Cont Facebook spart

Accesare Plex prin webstation

Reziliere contract Digi Mobil?
 

[PYTHON] Class in class

- - - - -
  • Please log in to reply
3 replies to this topic

#1
Konatau

Konatau

    Junior Member

  • Grup: Members
  • Posts: 205
  • Înscris: 18.03.2012
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
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
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
Konatau

Konatau

    Junior Member

  • Grup: Members
  • Posts: 205
  • Înscris: 18.03.2012
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
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View PostKonatau, 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?
Si ce a fost neclar in raspunsul meu de simti nevoia sa mai pui o data aceeasi intrebare?

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:

View PostKonatau, on 24 mai 2015 - 03:00, said:

Se poate ca unei variabile dintr-o clasa sa-i fie atribuita o alta variabila?
ci:

View PostKonatau, on 24 mai 2015 - 03:00, said:

Se poate ca unei variabile dintr-un obiect sa-i fie atribuita o alta variabila?
iar raspunsul e evident: da.

Edited by OriginalCopy, 24 May 2015 - 18:24.


Anunturi

Chirurgia cranio-cerebrală minim invazivă Chirurgia cranio-cerebrală minim invazivă

Tehnicile minim invazive impun utilizarea unei tehnologii ultramoderne.

Endoscoapele operatorii de diverse tipuri, microscopul operator dedicat, neuronavigația, neuroelectrofiziologia, tehnicile avansate de anestezie, chirurgia cu pacientul treaz reprezintă armamentarium fără de care neurochirurgia prin "gaura cheii" nu ar fi posibilă. Folosind tehnicile de mai sus, tratăm un spectru larg de patologii cranio-cerebrale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate