Magiczne metody __init__() i __new__() oraz __class__

Magiczne metody __init__() i __new__() oraz __class__
YU
  • Rejestracja:około 5 lat
  • Ostatnio:prawie 2 lata
  • Postów:3
0

Cześć,

właśnie jestem na etapie nauki klas, konkretnie metod magicznych.

  1. Spotkałam się z metodą __new__(), o której wiem tylko tyle, że ona się wywołuje przed __init__(). Działa podczas tworzenia obiektu i przekazuje parametry do __init__(). Próbowałam użyć ją z __init__():

    Kopiuj
    class ClassA():
        def __new__(self, imie, wiek):
            print("Tworze nowy obiekt")
    
        def __init__(self,imie, wiek):
            self.imiona = imie
            self.lat = wiek
            print("Przekazano parametry do init")        
    
    
    klasa = ClassA("Daria", 29)
    

    W rezultacie uzyskałam na konsoli napis "Tworze nowy obiekt", ale init nie wystartował. O co konkretnie chodzi z tym __new__() i __init__()?

  2. Spotkałam się z użyciem w klasie metody magicznej __class__. Poniżej podaję przykład:

    Kopiuj
    class ClassA:
    
      imie = 'Daria'
      wiek = 21
    
      def change(self):
        self.__class__.imie = 'Kasia'
        ClassA.wiek = 22
    

    Nie rozumiem, po co jest tutaj zastosowane __class__ i co ono robi. Użyłam zamiast self.__class__.imie = 'Kasia' to self.imie = 'Kasia' i uzyskałam ten sam wynik. Po co się to stosuje?

Pozdrawiam

edytowany 5x, ostatnio: Riddle
ledi12
  • Rejestracja:prawie 6 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Wrocław
2

__new__() w pythonie to prawdziwy konstruktor, którzy tworzy instancje obiektu. Wszystkie obiekty w pythonie są pochodnymi type. __init__() przypisuje jedynie właściwości temu obiektowi, czyli go inicjalizuje.

W Twoim przypadku init nic nie wyświetla, ponieważ nie tworzysz nowego obiektu. Dodaj coś w stylu

Kopiuj
def __new__(cls, *args, **kwargs):
  return super(ClassA, cls).__new__(cls, *args, **kwargs)

i zadziała.

W drugim przypadku bazujesz na zmiennych klasowych a nie instancji. Te są takie same dla każdej z instancji. A stosuje się w rozmaitych przypadkach, chociażby jako zmienne globalne dla wszystkich obiektów konkretnej klasy. Poza tym są to zmienne statyczne, więc nawet nie musisz tworzyć instancji, żeby je wywołać.


Robię http response status cody w martwych ciągach
edytowany 7x, ostatnio: Riddle
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:około 2 godziny
  • Postów:4935
0

Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:około 5 godzin
2

moim zdaniem:
__new__ to alokator, w c++ odpowiednik to https://en.cppreference.com/w/cpp/memory/new/operator_new
__init__ to konstruktor

jak na mój gust to __new__ w pythonie jest jeszcze mniej przydatny niż operator new w c++. operator new może przydać się teoretycznie do obsługi pul obiektów, ale już w pythonie nie ma gwarancji (w specyfikacji) co do odpalania destruktorów/ finalizerów.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 2x, ostatnio: Wibowit
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około godziny
  • Lokalizacja:Laska, z Polski
  • Postów:10086
0

Moja rada: raczej unikaj __new__() oraz __class__. Może się zdarzyć, prędzej czy później że znajdziesz potrzebę żeby ich użyć - i wtedy sobie o nich przypomnisz; ale do standardowego developmentu 99.99% przypadków to __init__().

edytowany 1x, ostatnio: Riddle

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.