1. Po to właśnie jest super(), żeby wywoływać metode rodzica, a nie robić to jawnie. Tak, tutaj wynik jest taki sam ale czy zawsze będzie?
Pójdźmy z przykładem wielodziedziczenia
class A(object):
def __init__(self):
print('A','\n')
class B(object):
def __init__(self):
print('B','\n')
class C(A, B):
def __init__(self):
super(C, self).__init__()
B.__init__(self)
c = C()
Sytuacja już wygląda inaczej.
Polecam te dwa materiały na rozjaśnienie:
https://www.youtube.com/watch?v=EiOglTERPEo
https://fuhm.net/super-harmful/
2.
__init__ za każdym razem jak będziemy wołać obiekt.
...co?
Za każdym razem gdy wołamy obiekt, wykonuje się funkcja __call__.
Natomiast __init__ wywołuje się zaraz po konstruktorze
__new__ się powinno używać bardzo rzadko (musisz mieć dobry powód). Singleton nie jest tym dobrym powodem
Singleton generalnie nie jest dobrym rozwiązaniem na nic.
Odsyłam do tego tematu, żeby się nie powtarzać
https://pl.python.org/forum/index.php?topic=6735.msg28580#msg28580