• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Python po co nam super() i dylemat __new__, a __init__

Object Storage Arubacloud
0 głosów
4,894 wizyt
pytanie zadane 13 września 2016 w Python przez Macek Kolo Mądrala (5,480 p.)
Python 3.4 albo wyżej


class A(object):
    def __init__(self):
        print('A','\n')

class B(A):
    def __init__(self):
        print('B','\n')
        super().__init__()
        A.__init__(self)
                
x = A()
y = B()

1. Czym się różni użycie super() od tej drugiej metody którą użyłem? Wynik przecież dają taki sam. 

2. Pytanie do zaawansowanych użytkowników. Czy używanie __new__ zamiast __init__ kiedy chcemy uniknąć redundancji np. przy SIngletonie/Multitonie to bardzo zał, czy tylko zła praktyka? Bo ja rozumiem, że __new__ to konstruktor i wywoła się raz, a __init__ za każdym razem jak będziemy wołać obiekt. 

2 odpowiedzi

0 głosów
odpowiedź 13 września 2016 przez Strategiusz Dyskutant (9,220 p.)
Co do pierwszego pytania, to widzę taką różnicę, że używając `A.__init__` musisz podać nazwę klasy, czyli masz zbędne powtórzenie tej nazwy z której dziedziczysz, co jest potencjalnym źródłem błędu, gdy zechcesz jednak dziedziczyć z innej i zmienisz nazwę klasy tylko w jednym miejscu.
0 głosów
odpowiedź 13 września 2016 przez Tomatosoup Pasjonat (18,530 p.)

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

komentarz 13 września 2016 przez Macek Kolo Mądrala (5,480 p.)
No właśnie z tego tematu co podlinkowałeś wywnioskowałem, że __init__ wywołuje się za każdym razem i dlatego nie działa w Singletonie

No w twoim przykładzie dziedziczysz po 2 klasach, więc jak chce metodę z tej drugiej to i tak muszę się odwoływać za pomocą nazwy klasy

Podobne pytania

0 głosów
1 odpowiedź 1,197 wizyt
pytanie zadane 9 lutego 2018 w Python przez chmod96 Obywatel (1,380 p.)
0 głosów
5 odpowiedzi 496 wizyt
0 głosów
1 odpowiedź 240 wizyt
pytanie zadane 13 października 2015 w Offtop przez Wartownik Obywatel (1,990 p.)

92,539 zapytań

141,382 odpowiedzi

319,477 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...