Python super ()

Super () încorporat returnează un obiect proxy (obiect temporar al superclasei) care ne permite să accesăm metodele clasei de bază.

În Python, super()are două cazuri majore de utilizare:

  • Ne permite să evităm să folosim în mod explicit numele clasei de bază
  • Lucrul cu moștenirea multiplă

Exemplul 1: super () cu moștenire unică

În cazul moștenirii unice, ne permite să referim clasa de bază după super().

 class Mammal(object): def __init__(self, mammalName): print(mammalName, 'is a warm-blooded animal.') class Dog(Mammal): def __init__(self): print('Dog has four legs.') super().__init__('Dog') d1 = Dog()

Ieșire

Câinele are patru picioare. Câinele este un animal cu sânge cald.

Aici am numit __init__()metoda clasei Mammal (din clasa Dog) folosind cod

 super () .__ init __ („Câine”)

în loc de

 Mamifer .__ init __ (sine, „câine”)

Deoarece nu este necesar să specificăm numele clasei de bază atunci când îi apelăm membrii, putem schimba cu ușurință numele clasei de bază (dacă este nevoie).

 # changing base class to CanidaeFamily class Dog(CanidaeFamily): def __init__(self): print('Dog has four legs.') # no need to change this super().__init__('Dog')

super()Comanda interna returnează un obiect proxy, un obiect substitut care pot apela metode ale clasei de bază prin delegare. Aceasta se numește indirectare (abilitatea de a face referire la obiectul de bază cu super())

Deoarece indirecția este calculată în timpul rulării, putem folosi diferite clase de bază în momente diferite (dacă este nevoie).

Exemplul 2: super () cu mostenire multipla

 class Animal: def __init__(self, Animal): print(Animal, 'is an animal.'); class Mammal(Animal): def __init__(self, mammalName): print(mammalName, 'is a warm-blooded animal.') super().__init__(mammalName) class NonWingedMammal(Mammal): def __init__(self, NonWingedMammal): print(NonWingedMammal, "can't fly.") super().__init__(NonWingedMammal) class NonMarineMammal(Mammal): def __init__(self, NonMarineMammal): print(NonMarineMammal, "can't swim.") super().__init__(NonMarineMammal) class Dog(NonMarineMammal, NonWingedMammal): def __init__(self): print('Dog has 4 legs.'); super().__init__('Dog') d = Dog() print('') bat = NonMarineMammal('Bat')

Ieșire

Câinele are 4 picioare. Câinele nu poate înota. Câinele nu poate zbura. Câinele este un animal cu sânge cald. Câinele este un animal. Liliacul nu poate înota. Liliacul este un animal cu sânge cald. Liliacul este un animal.

Ordin de rezolvare a metodei (MRO)

Ordinea de rezoluție a metodelor (MRO) este ordinea în care metodele ar trebui moștenite în prezența moștenirii multiple. Puteți vizualiza MRO utilizând __mro__atributul.

 >>> Câine .__ mro__ (,,,,,)

Iată cum funcționează MRO:

  • O metodă din apelurile derivate este întotdeauna apelată înainte de metoda clasei de bază.
    În exemplul nostru, clasa de câine este numită înainte de NonMarineMammal sau NoneWingedMammal. Aceste două clase sunt numite înainte de mamifer, care se numește înainte de Animal, iar clasa Animal este numită înainte de obiect.
  • Dacă există mai mulți părinți Dog(NonMarineMammal, NonWingedMammal), metodele NonMarineMammal sunt invocate mai întâi, deoarece acestea apar mai întâi.

Pentru a afla mai multe despre super(), vizitați super () Python considerat super!

Articole interesante...