2.20. Förstklassiga klasser¶
En klass grupperar data och de funktioner som verkar på den datan under ett enda namn. Att ta till en sådan är värt besväret när flera tillståndsdelar hör ihop och de flesta funktionerna i ett skript tar samma uppsättning värden som argument.
2.20.1. Nyckelordet class¶
Nyckelordet är class. Kroppen innehåller en __init__-metod som körs varje gång en ny instans skapas:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
p = Point(3, 4)
print(p.x, p.y)
Utmatning:
3 4
Point är klassen; p är en instans av den. Parenteserna i anropet Point(3, 4) anropar __init__, som tilldelar argumenten till attribut på den nya instansen. self är det konventionella namnet för instansen; self.x sätter ett attribut som resten av instansens metoder kommer att läsa.
2.20.2. När man ska använda en klass¶
Ta till en klass när dessa är sanna samtidigt:
En handfull relaterade värden färdas tillsammans överallt (en punkts
xochy; en sensoravläsnings värde, enhet och tidsstämpel).Flera funktioner tar samma uppsättning värden och verkar på dem.
Det är användbart att hålla mer än ett av dessa knippen vid liv samtidigt, åtskilda från varandra.
Om datan är av engångskaraktär räcker en vanlig dict eller tuple oftast. Om du bara behöver ett enda knippe konstanter duger variabler på modulnivå. Klasser är inte standardbehållaren – de förtjänar sin plats när tillstånd och beteende vill hålla ihop.
2.20.3. Vad __init__ gör¶
__init__ är bara en vanlig metod. Allt som tilldelas self inuti den blir ett attribut på den nya instansen:
class Sensor:
def __init__(self, name, unit):
self.name = name
self.unit = unit
self.readings = []
temp = Sensor("temperature", "C")
print(temp.name, temp.unit, temp.readings)
Utmatning:
temperature C []
readings initieras till en tom lista – varje ny instans får sin egen lista, inte en delad. Allt som inte tilldelas self är lokalt för __init__ och försvinner när den returnerar.