Polymorfismus v Python s PŘÍKLADY

⚡ Chytré shrnutí

Polymorfismus v Python umožňuje jednomu rozhraní pracovat s objekty různých typů, takže stejná metoda nebo operátor se chová odlišně v závislosti na objektu. Projevuje se to přetížením operátorů, vestavěnými funkcemi, uživatelsky definovanými metodami a dědičností napříč Python programy.

  • 🔘 Definice: Polymorfismus znamená „mnoho forem“, což umožňuje jednomu rozhraní fungovat na různých datových typech nebo třídách.
  • ☑️ Operapřetížení torů: Operátor + sčítá čísla, ale zároveň zřetězuje řetězce, což ukazuje polymorfismus operátorů.
  • (Tj. Vestavěné funkce: Funkce jako len() fungují stejně s řetězci, seznamy a slovníky.
  • 🧪 Uživatelsky definované metody: Třídy mohou sdílet názvy metod, jako například area() a perimeter() pro různé tvary.
  • 🛠️ Dědictví: Přepsání metody umožňuje podřízené třídě předefinovat nadřazenou metodu za běhu.
  • 🤖 Relevance umělé inteligence: Knihovny strojového učení opakovaně používají sdílená rozhraní, jako je fit() a forward(), napříč modely.

Polymorfismus v Python

Co je to polymorfismus?

Polymorfismus lze definovat jako stav, který se vyskytuje v mnoha různých formách. Je to koncept v Python programování, ve kterém je objekt definovaný v Python lze použít různými způsoby. Umožňuje programátorovi definovat více metod v odvozené třídě a má stejný název jako v nadřazené třídě. Takové scénáře podporují přetížení metod Python.

Polymorfismus v Operatorů

Operátor v Python pomáhá provádět matematické a několik dalších programovacích úloh. Například operátor '+' pomáhá při sčítání mezi dvěma celočíselnými typy v Python, a stejným způsobem stejný operátor pomáhá při zřetězení řetězců v Python programování.

Vezměme si příklad + (plus) operátor v Python k zobrazení aplikace polymorfismu v Python jak je uvedeno níže:

Python Code:

p = 55
q = 77
r = 9.5
g1 = "Guru"
g2 = "99!"
print("the sum of two numbers",p + q)
print("the data type of result is",type(p + q))
print("The sum of two numbers",q + r)
print("the data type of result is", type (q + r))
print("The concatenated string is", g1 + g2)
print("The data type of two strings",type(g1 + g2))

Výstup:

the sum of two numbers 132
the data type of result is <class 'int'>

The sum of the two numbers 86.5
the data type of result is <class 'float'>

The concatenated string is Guru99!
The data type of two strings <class 'str'>

Výše uvedený příklad lze také považovat za příklad přetížení operátora.

Polymorfismus v uživatelsky definovaných metodách

Uživatelem definovaná metoda v Python programovací jazyk jsou metody, které uživatel vytváří a deklaruje se pomocí klíčového slova def s názvem funkce.

Polymorfismus v Python programovacího jazyka je dosaženo přetížením a přepsáním metody. Python definuje metody s klíčovým slovem def a se stejným názvem v podřízené i rodičovské třídě.

Vezměme si následující příklad, jak je ukázáno níže: –

Python Code:

from math
import pi
class square:
    def __init__(self, length):
    self.l = length
def perimeter(self):
    return 4 * (self.l)
def area(self):
    return self.l * self.l
class Circle:
    def __init__(self, radius):
    self.r = radius
def perimeter(self):
    return 2 * pi * self.r
def area(self):
    return pi * self.r * * 2
# Initialize the classes
sqr = square(10)
c1 = Circle(4)
print("Perimeter computed for square: ", sqr.perimeter())
print("Area computed for square: ", sqr.area())
print("Perimeter computed for Circle: ", c1.perimeter())
print("Area computed for Circle: ", c1.area())

Výstup:

Perimeter computed for square:  40
Area computed for square:  100
Perimeter computed for Circle:  25.132741228718345
Area computed for Circle:  50.26548245743669

Ve výše uvedeném kódu jsou dvě uživatelem definované metody, obvod a plocha, definované v kruhových a čtvercových třídách.

Jak je ukázáno výše, jak třída kruh, tak třída čtverec vyvolávají stejný název metody zobrazující charakteristiku polymorfismu, aby poskytl požadovaný výstup.

Polymorfismus ve funkcích

Vestavěné funkce v Python jsou navrženy a kompatibilní pro provádění několika typů dat. V Python, len() je jednou z klíčových vestavěných funkcí.

Funguje s několika datovými typy: seznam, n-tice, řetězec a slovník. Funkce len() vrací přesné informace odpovídající těmto datovým typům.

Následující obrázek ukazuje, jak lze použít polymorfismus Python ve vztahu k vestavěným funkcím: –

Polymorfismus ve funkcích

Následující program pomáhá při ilustraci aplikace polymorfismu v Python: -

Python Code:

print ("The length of string Guru99 is ",len("Guru99"))
print("The length of list is ",len(["Guru99","Example","Reader"]))
print("The length of dictionary is ",len({"Website name":"Guru99","Type":"Education"}))

Výstup:

The length of string Guru99 is 6
The length of the list is 3
The length of the dictionary is 2

Polymorfismus ve funkcích

Ve výše uvedeném příkladu funkce len() třídy Python provádí polymorfismus pro datové typy řetězců, seznamů a slovníků.

Polymorfismus a dědičnost

Dědictví v Python lze definovat jako koncept programování, ve kterém podřízená třída definovala vlastnosti z jiné základní třídy přítomné v Python.

Klíčové jsou dva Python koncepty nazývané overriding metody a přetížení metody.

  • Při přetížení metody, Python poskytuje funkci vytváření metod, které mají stejný název pro provádění nebo provádění různých funkcí v daném kusu kódu. Umožňuje přetěžovat metody a používá je k provádění různých úkolů v jednodušších termínech.
  • V přepisování metody Python přepíše hodnotu, která sdílí podobný název v nadřazených a podřízených třídách.

Vezměme si následující příklad polymorfismu a dědičnosti, jak je ukázáno níže: –

Python Code:

class baseclass:
    def __init__(self, name):
    self.name = name
def area1(self):
    pass
def __str__(self):
    return self.name
class rectangle(baseclass):
    def __init__(self, length, breadth):
    super().__init__("rectangle")
self.length = length
self.breadth = breadth
def area1(self):
    return self.length * self.breadth
class triangle(baseclass):
    def __init__(self, height, base):
    super().__init__("triangle")
self.height = height
self.base = base
def area1(self):
    return (self.base * self.height) / 2
a = rectangle(90, 80)
b = triangle(77, 64)
print("The shape is: ", b)
print("The area of shape is", b.area1())
print("The shape is:", a)
print("The area of shape is", a.area1())

Výstup:

The shape is: a triangle
The area of a shape is 2464.0

The shape is: a rectangle
The area of a shape is 7200

Ve výše uvedeném kódu mají metody stejný název definovaný jako metoda init a metoda area1. Objekt třídy čtverec a obdélník se pak použije k vyvolání těchto dvou metod k provedení různých úkolů a poskytnutí výstupu oblasti čtverce a obdélníku.

Polymorfismus s třídními metodami

Jedno Python programování umožňuje programátorům dosáhnout polymorfismu a přetížení metod metodami tříd. Různé třídy v Python může mít metody, které jsou deklarovány pod stejným názvem napříč Python kód.

In Pythonlze definovat dvě různé třídy. Jedna by byla podřízená třída a odvozuje atributy z jiné definované třídy nazývané rodičovská třída.

Následující příklad ilustruje koncept polymorfismu s metodami tříd: –

Python Code:

class amazon:
    def __init__(self, name, price):
    self.name = name
self.price = price
def info(self):
    print("This is product and am class is invoked. The name is {self.name}. This costs {self.price} rupees.")
class flipkart:
    def __init__(self, name, price):
    self.name = name
self.price = price
def info(self):
    print(f "This is product and fli class is invoked. The name is {self.name}. This costs {self.price} rupees.")
FLP = flipkart("Iphone", 2.5)
AMZ = amazon("Iphone", 4)
for product1 in (FLP, AMZ):
    product1.info()

Výstup:

This is a product, and fli class is invoked. The name is iPhone, and this costs 2.5 rupees.
This is a product, and am class is invoked. The name is iPhone, and this costs 4 rupees.

Ve výše uvedeném kódu dvě různé třídy pojmenované jako flipkart a amazon používají stejné názvy metod info a init k poskytnutí příslušných cenových nabídek produktu a dále ilustrují koncept polymorfismu v Python.

Rozdíl mezi přetížením metody a polymorfismem v době kompilace

V polymorfismu v době kompilace je kompilátor Python program vyřeší hovor. Polymorfismus v době kompilace je dosažen přetížením metody.

Jedno Python kompilátor neřeší volání během běhu pro polymorfismus. Je také klasifikován jako metoda překrývající, kde stejné metody nesou podobné podpisy nebo vlastnosti, ale tvoří součást různých tříd.

Nejčastější dotazy

Kachní typing Pojďme Python Posuďte objekt podle metod, které poskytuje, spíše než podle typu jeho třídy. Pokud má objekt požadovanou metodu, funguje, v souladu s myšlenkou „pokud chodí jako kachna a kváká jako kachna, je to kachna“.

Ne tradičně. Pokud dvě metody sdílejí název, vítězí poslední definice. Python místo toho simuluje přetížení pomocí výchozích argumentů, argumentů s proměnnou délkou *argumentů nebo dekorátoru functools.singledispatch pro zpracování různých typů argumentů v rámci jedné funkce.

AbstracZákladní třídy t z modulu abc deklarují metody, které musí implementovat každá podtřída. Vynucují sdílené rozhraní, takže nesouvisející podtřídy lze polymorfně používat, zatímco Python zaručuje, že každý z nich poskytuje požadované metody.

Polymorfismus zlepšuje znovupoužitelnost kódu, flexibilitu a škálovatelnost. Jedna funkce nebo rozhraní může zpracovat mnoho typů objektů, což snižuje duplicitu, zjednodušuje údržbu a umožňuje přidávat nové třídy bez nutnosti přepisovat kód, který je již používá.

Ano. Skrz kachnu typingNesouvisející třídy, které implementují stejnou metodu, lze používat zaměnitelně bez sdíleného rodiče. OperaPřetížení Toru a vestavěné funkce jako len() také poskytují polymorfismus bez dědičnosti.

Polymorfismus se objevuje, když jedna funkce zpracovává řetězce, seznamy nebo vlastní objekty, v ovladačích databází, které zpřístupňují jedno API napříč enginy, a v sadách nástrojů GUI, kde mnoho widgetů sdílí metody draw() nebo update() volané prostřednictvím jednoho rozhraní.

Rámce umělé inteligence závisí na polymorfismu. V PyTorch, každý model podtřídí nn.Module a přepíše forward(); ve scikit-learn sdílejí odhady metody fit() a predict(), takže různé algoritmy běží přes jedno konzistentní, zaměnitelné rozhraní.

Ano. GitHub Copilot a agentní AI asistenti generují funkce typu kachna, navrhují abs.traczákladní třídy t a refaktorovat opakované metody do polymorfních návrhů z krátkého promptu. RevProhlédněte si výstup a ověřte, zda jsou logika a rozhraní správné.

Shrňte tento příspěvek takto: