To s tím Javascriptem je docela dobrá paralela. Protože díky tomu, že Javascript neměl žádný zvláštní cukr na vytváření objektů, vzniklo pár zajímavejch článků na toto téma. Díky tomu (a taky proto, že jsem si to zkusil :-) ) je mi jasné, že v tom Pythonu je objekt opravdu jen převlečený slovník. S jednou výjimkou. Ta výjimka souvisí s dědičností a s dynamičností Pythonu - že můžeš už vytvořenému objektu přidat metodu tak, že přidáš metodu do jeho předka. A vzhledem k tomu, že něco takového opravdu, ale opravdu nechci, tak se mi to scvrkne na "objekt = dict".
To se ti scvrkava spatne. Dict je object, ale object neni dict. Jedna se o dve ruzne abstrakce, ktere dokonce ani nejsou na stejne urovni. Objekty pouzivaji dict pro ulozeni interniho stavu, ale to neznamena, ze se sobe rovnaji.
Lisi se nejen svou abstrakci, ale i svou funkcionalitou. Pokud to nechapes, zkus pomoci dictu implementovat tyto objekty 'a', 'b' a 'c' typu 'A' a 'B' a provest s nimi predvedene operace.
Porovname si pracnost, rychlost a prehlednost vysledku a pak pochopite, nejen ze od dictu k objektu je to hodne daleko, ale i to, ze ten synktaticky cukr je uzitecny a potrebny.
1 class X():
2 counter = 5
3
4 def __init__(self, x=0):
5 if self.__class__.counter < 0:
6 raise RuntimeError('Overflow maximum allowed instances.')
7 self.__id = self.__class__.counter
8 self.__class__.counter -= 1
9 self.__x = x
10
11 @property
-- 12 def x(self):
13 return self.__x
14
15 @property
-- 16 def id(self):
17 return self.__id
18
19 def __iadd__(self, val):
20 self.__x += val
21 return self
22
23 def __add__(self, val):
24 if isinstance(val, type(self)):
25 return self.__class__(val.x + self.__x)
26 raise TypeError(f"unsupported operand type(s) for +: " + \
27 f"'{type(self).__name__}' and '{type(a).__name__}'")
28
29 def __repr__(self):
30 return f'{self.__x} of type: {type(self).__name__} and id: {self.__id}'
31
-- 32 class A(X):
33 pass
34
-- 35 class B(X):
36 pass
37
38 # vytvoreni objektu 'a', 'b' a 'c' a operace s nimi
-- 39 a = A()
-- 40 b = B(7)
41
42 print(a.x) # 0
43 print(a.id) # 5
44 print(a) # 0 of type: A and id: 5
45 print(b) # 7 of type: B and id: 5
46
47 a += 10
-- 48 c = a + a
49 print(c) # 20 of type: A and id: 4
50 print(a + c) # 30 of type: A and id: 3
51
>> 52 a.id = 1 # AttributeError, zakaz zapisu do atributu
-- 53 a + b # Type error, secist lze jen objekty stejneho typu
54 a += a # Type error, pridat jde jen int hodnota
-- 55