Magiske metoder i Python

Magiske metoder i Python

Denne artikel forklarer magiske metoder i Python.

YouTube Video

Magiske metoder i Python

Magiske metoder (specielle metoder) i Python er særligt navngivne metoder, der bruges til at give klasser unikke egenskaber. De kendetegnes f.eks. ved at være omsluttet af dobbelte underscores (dunders), som __init__ og __str__. Derfor kaldes de også dunder-metoder.

Ved at definere magiske metoder kan du tilpasse klassers standardadfærd. For eksempel tillader definitionen af __add__, at du kan ændre opførslen af +-operatoren.

Magiske metoder til initialisering og strengrepræsentation

__init__: Initialiseringsmetode

__init__-metoden er en konstruktør, der automatisk kaldes, når en instans oprettes.

1class Person:
2    def __init__(self, name, age):
3        self.name = name
4        self.age = age
5
6person = Person("Alice", 30)
7print(person.name)  # Alice

__str__: Menneskeligt læsbar strengrepræsentation

__str__-metoden returnerer en menneskeligt læsbar strengrepræsentation. Den kaldes af print() og str().

1class Person:
2    def __init__(self, name):
3        self.name = name
4
5    def __str__(self):
6        return f"Person: {self.name}"
7
8person = Person("Bob")
9print(person)  # Person: Bob

__repr__: Debug-orienteret strengrepræsentation

__repr__-metoden returnerer en strengrepræsentation til debugging-formål. Den bruges af repr() og når der vises i fortolkeren.

1class Person:
2    def __init__(self, name):
3        self.name = name
4
5    def __repr__(self):
6        return f"Person(name={self.name!r})"
7
8person = Person("Eve")
9print(repr(person))  # Person(name='Eve')

Overbelastning af aritmetiske operatorer

__add__: +-operatoren

Ved at bruge magiske metoder kan aritmetiske operatorer overbelastes. For eksempel kan __add__-metoden overbelaste +-operatoren.

 1class Vector:
 2    def __init__(self, x, y):
 3        self.x = x
 4        self.y = y
 5
 6    def __add__(self, other):
 7        return Vector(self.x + other.x, self.y + other.y)
 8
 9    def __repr__(self):
10        return f"Vector({self.x}, {self.y})"
11
12    # Other arithmetic magic methods:
13    # def __sub__(self, other):       # Subtraction (-)
14    # def __mul__(self, other):       # Multiplication (*)
15    # def __truediv__(self, other):   # True division (/)
16    # def __floordiv__(self, other):  # Floor division (//)
17    # def __mod__(self, other):       # Modulo (%)
18    # def __pow__(self, other):       # Exponentiation (**)
19
20v1 = Vector(1, 2)
21v2 = Vector(3, 4)
22print(v1 + v2)  # Vector(4, 6)

Andre aritmetiske magiske metoder omfatter følgende:.

Metode Operator
__add__ +
__sub__ -
__mul__ *
__truediv__ /
__floordiv__ //
__mod__ %
__pow__ **

Tilpasning af sammenligningsoperatorer

Du kan også overbelaste sammenligningsoperatorer. For eksempel overbelaster __eq__-metoden lighedsoperatoren.

 1class Box:
 2    def __init__(self, volume):
 3        self.volume = volume
 4
 5    def __eq__(self, other):
 6        return self.volume == other.volume
 7
 8    def __lt__(self, other):
 9        return self.volume < other.volume
10
11    # Comparison magic methods:
12    # def __eq__(self, other):  # Equal to (==)
13    # def __ne__(self, other):  # Not equal to (!=)
14    # def __lt__(self, other):  # Less than (<)
15    # def __le__(self, other):  # Less than or equal to (<=)
16    # def __gt__(self, other):  # Greater than (>)
17    # def __ge__(self, other):  # Greater than or equal to (>=)
18
19b1 = Box(100)
20b2 = Box(200)
21
22print(b1 == b2)  # False
23print(b1 < b2)   # True

Der er også følgende magiske metoder:. Disse magiske metoder definerer sammenligninger som lighed og rækkefølge mellem objekter.

Operator Magisk metode
== __eq__
!= __ne__
< __lt__
<= __le__
> __gt__
>= __ge__

Magiske metoder for containertyper

Du kan oprette klasser, der opfører sig som lister eller ordbøger.

__len__: Hentning af antal elementer

__len__-metoden er en magisk metode, der returnerer antallet af elementer.

1class Basket:
2    def __init__(self, items):
3        self.items = items
4
5    def __len__(self):
6        return len(self.items)
7
8basket = Basket(["apple", "banana"])
9print(len(basket))  # 2

__getitem__: Indeksadgang

__getitem__-metoden kaldes ved indeksadgang.

1class Basket:
2    def __init__(self, items):
3        self.items = items
4
5    def __getitem__(self, index):
6        return self.items[index]
7
8basket = Basket(["apple", "banana"])
9print(basket[1])  # banana

__setitem__ og __delitem__: Skrivning og sletning

__setitem__- og __delitem__-metoderne kaldes ved skrivning eller sletning af elementer.

 1class Basket:
 2    def __init__(self, items):
 3        self.items = items
 4
 5    def __setitem__(self, index, value):
 6        self.items[index] = value
 7
 8    def __delitem__(self, index):
 9        del self.items[index]
10
11basket = Basket(["apple", "banana"])
12basket[1] = "grape"
13del basket[0]
14print(basket.items)  # ['grape']

Magiske metoder til iteration

For at gøre et objekt itererbart i en for-løkke, skal du implementere følgende:.

__iter__ og __next__

 1class Counter:
 2    def __init__(self, limit):
 3        self.limit = limit
 4        self.current = 0
 5
 6    def __iter__(self):
 7        return self
 8
 9    def __next__(self):
10        if self.current >= self.limit:
11            raise StopIteration
12        self.current += 1
13        return self.current
14
15for num in Counter(3):
16    print(num)
17# Output:
18# 1
19# 2
20# 3

Kontextmanager (with-sætning)

Ved at definere metoderne __enter__ og __exit__ kan du implementere for- og efterbehandling til with-sætningen.

 1class FileOpener:
 2    def __init__(self, filename):
 3        self.filename = filename
 4
 5    def __enter__(self):
 6        self.file = open(self.filename, 'r')
 7        return self.file
 8
 9    def __exit__(self, exc_type, exc_val, exc_tb):
10        self.file.close()
11
12with FileOpener("example.txt") as f:
13    content = f.read()
14    print(content)

Kald-bare objekter: __call__

Ved at definere __call__-metoden, kan du gøre en instans kald-bar ligesom en funktion.

1class Greeter:
2    def __init__(self, greeting):
3        self.greeting = greeting
4
5    def __call__(self, name):
6        return f"{self.greeting}, {name}!"
7
8hello = Greeter("Hello")
9print(hello("Alice"))  # Hello, Alice!

Sammendrag

Magiske metoder i Python er en kraftfuld måde at tilføje naturlig og intuitiv adfærd til klasser. Hver metode har et klart formål, og korrekt implementering gør det muligt at skrive mere fleksibel og pythonisk kode.

Magiske metoder fungerer som et 'usynligt interface', der understøtter, hvordan Python-objekter interagerer og opfører sig bag kulisserne.

Du kan følge med i ovenstående artikel ved hjælp af Visual Studio Code på vores YouTube-kanal. Husk også at tjekke YouTube-kanalen.

YouTube Video