Tässä opetusohjelmassa opitaan polymorfismista, erityyppisistä polymorfismeista ja siitä, miten voimme toteuttaa ne Pythonissa esimerkkien avulla.
Mikä on polymorfismi?
Polymorfismin kirjaimellinen merkitys on esiintymisen edellytys eri muodoissa.
Polymorfismi on erittäin tärkeä käsite ohjelmoinnissa. Se viittaa yhden tyyppisen yksikön (menetelmän, operaattorin tai objektin) käyttöön edustamaan erilaisia tyyppejä eri tilanteissa.
Otetaan esimerkki:
Esimerkki 1: Polymorfismi lisäksi operaattori
Tiedämme, että +
operaattoria käytetään laajasti Python-ohjelmissa. Mutta sillä ei ole yhtä käyttöä.
Kokonaislukutietotyypeille +
operaattoria käytetään suorittamaan aritmeettinen summaustoiminto.
num1 = 1 num2 = 2 print(num1+num2)
Siksi yllä olevat ohjelman tuotokset 3.
Samoin merkkijonotietotyypeille +
operaattoria käytetään ketjutuksen suorittamiseen.
str1 = "Python" str2 = "Programming" print(str1+" "+str2)
Tämän seurauksena yllä oleva ohjelma tuottaa Python-ohjelmoinnin.
Tässä voimme nähdä, että yhtä operaattoria +
on käytetty erilaisten toimintojen suorittamiseen erillisille tietotyypeille. Tämä on yksi yksinkertaisimmista polymorfismin esiintymisistä Pythonissa.
Funktion polymorfismi Pythonissa
Pythonissa on joitain toimintoja, jotka ovat yhteensopivia useiden tietotyyppien kanssa.
Yksi tällainen toiminto on len()
toiminto. Se voi toimia monilla tietotyypeillä Pythonissa. Katsotaanpa joitain esimerkkejä funktion käyttötapauksista.
Esimerkki 2: Polymorfinen len () -funktio
print(len("Programiz")) print(len(("Python", "Java", "C"))) print(len(("Name": "John", "Address": "Nepal")))
Tuotos
9 3 2
Täällä voimme nähdä, että monet tietotyypit, kuten merkkijono, luettelo, dupleksi, joukko ja sanakirja, voivat toimia len()
toiminnon kanssa. Voimme kuitenkin nähdä, että se palauttaa erityisiä tietoja tietyistä tietotyypeistä.
![](https://cdn.wiki-base.com/1025615/polymorphism_in_pythonwith_examples.png.webp)
Luokan polymorfismi Pythonissa
Polymorfismi on erittäin tärkeä käsite olio-ohjelmoinnissa.
Lisätietoja OOP: sta Pythonissa on osoitteessa Python Object Oriented Programming
Voimme käyttää polymorfismin käsitettä luodessamme luokkamenetelmiä, sillä Python antaa eri luokille mahdollisuuden käyttää menetelmiä samalla nimellä.
Sitten voimme myöhemmin yleistää näiden menetelmien kutsumisen jättämällä huomioimatta objektin, jonka kanssa työskentelemme. Katsotaanpa esimerkkiä:
Esimerkki 3: Polymorfismi luokkamenetelmissä
class Cat: def __init__(self, name, age): self.name = name self.age = age def info(self): print(f"I am a cat. My name is (self.name). I am (self.age) years old.") def make_sound(self): print("Meow") class Dog: def __init__(self, name, age): self.name = name self.age = age def info(self): print(f"I am a dog. My name is (self.name). I am (self.age) years old.") def make_sound(self): print("Bark") cat1 = Cat("Kitty", 2.5) dog1 = Dog("Fluffy", 4) for animal in (cat1, dog1): animal.make_sound() animal.info() animal.make_sound()
Tuotos
Miau olen kissa. Nimeni on Kitty. Olen 2,5-vuotias. Meow Bark Olen koira. Nimeni on Fluffy. Olen 4-vuotias. Haukkua
Täällä olemme luoneet kaksi luokkaa Cat
ja Dog
. Niillä on samanlainen rakenne ja niillä on samat menetelmien nimet info()
ja make_sound()
.
Huomaa kuitenkin, että emme ole luoneet yhteistä superluokkaa tai linkittäneet luokkia millään tavalla. Silloinkin voimme pakata nämä kaksi erilaista esinettä dupleksiin ja iteroida sen läpi käyttämällä yhteistä eläinmuuttujaa. Se on mahdollista polymorfismin takia.
Polymorfismi ja perintö
Muiden ohjelmointikielien tavoin myös Pythonin lapsiluokit perivät menetelmiä ja määritteitä vanhempaluokalta. Voimme määritellä uudelleen tietyt menetelmät ja määritteet nimenomaan lapsiluokan mukaisiksi , mikä tunnetaan nimellä Method Overriding .
Polymorfismi antaa meille mahdollisuuden käyttää näitä ohitettuja menetelmiä ja määritteitä, joilla on sama nimi kuin vanhempaluokalla.
Katsotaanpa esimerkkiä:
Esimerkki 4: Menetelmän ohittaminen
from math import pi class Shape: def __init__(self, name): self.name = name def area(self): pass def fact(self): return "I am a two-dimensional shape." def __str__(self): return self.name class Square(Shape): def __init__(self, length): super().__init__("Square") self.length = length def area(self): return self.length**2 def fact(self): return "Squares have each angle equal to 90 degrees." class Circle(Shape): def __init__(self, radius): super().__init__("Circle") self.radius = radius def area(self): return pi*self.radius**2 a = Square(4) b = Circle(7) print(b) print(b.fact()) print(a.fact()) print(b.area())
Tuotos
Ympyrä olen kaksiulotteinen muoto. Neliöiden kulmat ovat 90 astetta. 153,93804002589985
Tässä voimme nähdä, että menetelmiä __str__()
, joita ei ole ohitettu lapsiluokissa, käytetään vanhempainluokasta.
Polymorfismin takia Python-tulkki tunnistaa automaattisesti, että fact()
objektin menetelmä a
(neliöluokka) ohitetaan. Joten se käyttää lapsiluokassa määriteltyä.
Toisaalta, koska fact()
objektin b menetelmää ei ohiteta, sitä käytetään Parent Shape -luokasta.
![](https://cdn.wiki-base.com/1025615/polymorphism_in_pythonwith_examples_2.png.webp)
Huomaa : Menetelmän ylikuormitus , tapa luoda useita menetelmiä samalla nimellä, mutta eri argumenteilla, ei ole mahdollista Pythonissa.