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