Osa 9

Metodernas räckvidd

De metoder som definieras inom en klass kan döljas på exakt samma sätt som attributen i föregående avsnitt. Om metoden börjar med två understreck __ är den inte direkt åtkomlig för klienten.

Tekniken är alltså densamma för både metoder och attribut, men användningsfallen är oftast lite annorlunda. Privata attribut kommer ofta tillsammans med getter- och sättar-metoder för att kontrollera åtkomsten till dem. Privata metoder å andra sidan är vanligtvis endast avsedda för internt bruk, som hjälpmetoder för processer som klienten inte behöver känna till.

En privat metod kan användas inom klassen precis som vilken annan metod som helst, men man måste naturligtvis komma ihåg att inkludera self-prefixet. Följande är en enkel klass som representerar mottagaren av e-postbrev. Den innehåller en privat hjälpmetod för att kontrollera att e-postadressen är i ett giltigt format:

class Mottagare:
    def __init__(self, namn: str, epost: str):
        self.__namn = namn
        if self.__granska_epost(epost):
            self.__epost = epost
        else:
            raise ValueError("Eposten duger inte")

    def __granska_epost(self, epost: str):
        # En enkel granksning: adressen måste vara över 5 symboler lång och innehålla en punkt och en @-symbol
        return len(epost) > 5 and "." in epost and "@" in epost

Försök att kalla den privata metoden direkt orsakar ett fel:

petter = Mottagare("Petter Keinonen", "petter@example.com")
petter.__granska_epost("naganannan@example.com")
Exempelutskrift

AttributeError: 'Mottagare' object has no attribute '__granska_epost'

Inom klassen kan metoden användas på normalt sätt, och det är vettigt att använda den även för att ange ett nytt värde för adressen. Låt oss lägga till getter- och sättar-metoder för e-postadressen:

class Mottagare:
    def __init__(self, namn: str, epost: str):
        self.__namn = namn
        if self.__granska_epost(epost):
            self.__epost = epost
        else:
            raise ValueError("Eposten duger inte")

    def __granska_epost(self, epost: str):
        # En enkel granksning: adressen måste vara över 5 symboler lång och innehålla en punkt och en @-symbol
        return len(epost) > 5 and "." in epost and "@" in epost

    @property
    def epost(self):
        return self.__epost

    @epost.setter
    def epost(self, epost: str):
        if self.__granska_epost(epost):
            self.__epost = epost
        else:
            raise ValueError("Eposten duger inte")

I följande exempel är klassen Kortlek en modell för en kortlek med 52 kort. Den innehåller hjälpmetoden __aterstall_kortlek, som skapar en ny blandad kortlek. Den privata metoden anropas för närvarande endast i konstruktörsmetoden, så implementationen skulle kunna placeras direkt i konstruktören. Att använda en separat metod gör dock koden mer lättläst och gör det också möjligt att komma åt funktionaliteten senare i andra metoder om det behövs.

from random import shuffle

class Kortlek:
    def __init__(self):
        self.__aterstall_kortlek()

    def __aterstall_kortlek(self):
        self.__packe = []
        # Vi lägger alla korten i packen
        sviter = ["spader", "hjarter", "klover", "ruter"]
        for svit in sviter:
            for nummer in range(1, 14):
                self.__packe.append((svit, nummer))
        # Blanda packen
        shuffle(self.__packe)

    def dela(self, kortens_antal: int):
        hand = []
        # Flytta korten på toppen av packen till handen
        for i in range(kortens_antal):
            hand.append(self.__packe.pop())
        return hand

Låt oss testa klassen:

kortlek = Kortlek()
hand1 = kortlek.dela(5)
print(hand1)
hand2 = kortlek.dela(5)
print(hand2)

Eftersom händerna är slumpmässigt genererade, är följande endast ett exempel av det som kunde utskrivas:

Exempelutskrift

[('spader', 7), ('spader', 11), ('hjarter', 7), ('ruter', 3), ('spader', 4)] [('klover', 8), ('spader', 12), ('ruter', 13), ('klover', 11), ('spader', 10)]

Privata metoder är i allmänhet mindre vanliga än privata attribut. En tumregel är att en metod ska döljas när klienten inte har något behov av att direkt komma åt den. Detta är särskilt fallet när det är möjligt att klienten kan påverka objektets integritet negativt genom att anropa metoden.

Loading
Du har nått slutet av den här delen! Fortsätt till nästa del:

Se dina poäng genom att klicka på cirkeln nere till höger av sidan.