Python Academy · Lektion

Polymorfism och duck typing

Skriv polymorf kod som fungerar med alla kompatibla objekt.

Lektion 4 av 414 steg

Polymorfism och duck typing är en gratis lektion i Python Academy på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Python Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Python Academy innehåller totalt 4 lektioner.

Introduktion

Polymorfism låter olika objekt reagera på samma gränssnitt. Duck typing innebär: om det beter sig som en anka är det en anka.

Vad är polymorfism?

Polymorfism betyder ”många former”. Samma metodnamn fungerar på olika sätt för olika objekt. Python använder detta i stor utsträckning.
class Cat:
    def speak(self): return 'Meow'
class Dog:
    def speak(self): return 'Woof'
for animal in [Cat(), Dog()]:
    print(animal.speak())

Duck typing

Python kräver ingen klasshierarki för polymorfism. Om ett objekt har rätt metod fungerar det. Det behövs inga gränssnitt.
class Duck:
    def quack(self): return 'Quack'
class Person:
    def quack(self): return 'I am quacking like a duck'
def make_it_quack(duck):
    print(duck.quack())
make_it_quack(Duck())
make_it_quack(Person())

Polymorfa funktioner

len() fungerar på strängar, listor, dicts och tupler – allt eftersom de implementerar __len__. Detta är inbyggd polymorfism.
for obj in ['hello', [1,2,3], {'a':1}]:
    print(type(obj).__name__, len(obj))

Operatoröverlagring

+ fungerar på heltal, flyttal, strängar och listor eftersom varje typ implementerar __add__ på olika sätt.
print(1 + 2)        # int addition
print('a' + 'b')    # string concat
print([1] + [2])    # list concat

Protokollbaserad duck typing

Iterationsprotokollet: alla objekt med __iter__ och __next__ fungerar i for-loopar – ingen basklass behövs.
class Squares:
    def __init__(self, n): self.n,self.i=n,0
    def __iter__(self): return self
    def __next__(self):
        if self.i>=self.n: raise StopIteration
        x=self.i**2; self.i+=1; return x
print(list(Squares(5)))

EAFP kontra LBYL

EAFP (Easier to Ask Forgiveness than Permission) använder try/except. LBYL (Look Before You Leap) använder if/hasattr. Python föredrar EAFP.
# LBYL:
if hasattr(obj, 'quack'):
    obj.quack()
# EAFP (Pythonic):
try:
    'hello'.quack()
except AttributeError:
    print('no quack')

isinstance() för säker dispatch

När Ni behöver typspecifikt beteende är isinstance() tydligare än att fånga AttributeError.
def process(data):
    if isinstance(data, str):
        return data.upper()
    elif isinstance(data, list):
        return [x*2 for x in data]
print(process('hi'))
print(process([1,2,3]))

Abstrakta basklasser som protokoll

from abc import ABC, abstractmethod definierar formella protokoll. Underklasser måste implementera abstrakta metoder.
from abc import ABC, abstractmethod
class Drawable(ABC):
    @abstractmethod
    def draw(self): pass
class Circle(Drawable):
    def draw(self): print('O')
Circle().draw()

typing.Protocol (3.8+)

class MyProtocol(Protocol): definierar strukturell subtypning utan ABC. Fungerar med mypy för statiska kontroller.
from typing import Protocol
class Quackable(Protocol):
    def quack(self) -> str: ...
def make_quack(x: Quackable) -> str:
    return x.quack()
print('protocol demo')

Polymorfism i praktiken

Utforma API:er som accepterar alla objekt med rätt gränssnitt. Då blir koden utbyggbar utan att behöva ändras.
class JSONSerializer:
    def serialize(self, obj): import json; return json.dumps(obj)
class XMLSerializer:
    def serialize(self, obj): return f'<data>{obj}</data>'
def export(data, serializer):
    return serializer.serialize(data)
print(export({'x': 1}, JSONSerializer()))

Snabb kontroll

Vad innebär duck typing i Python?

Sammanfattning

Polymorfism: samma gränssnitt, olika beteende. Duck typing: beteendet är viktigt, inte typen. Protokoll definierar gränssnitt informellt. EAFP (try/except) är typiskt för Python.

Fortsätt

Utmärkt framsteg! Fortsätt för att behärska nästa koncept.
Gratis att börja

Lär dig Python med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
76
Lektioner
320

Vanliga frågor

Är lektionen ”Polymorfism och duck typing” gratis?

Ja – hela texten till ”Polymorfism och duck typing” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Python Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Python Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Polymorfism och duck typing”?

Skriv polymorf kod som fungerar med alla kompatibla objekt. Ni övar på Python Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Python Academy?

Du behöver inga förkunskaper. Utbildningen i Python Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Polymorfism och duck typing”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Python Academy-lektionen?

Ja. Varje Python Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Enkel arvshierarki
  2. Åsidosätta metoder och super()
  3. Multipelt arv och MRO
  4. Polymorfism och duck typing
← Tillbaka till Python Academy