A kérdés elsőre talán még ellentmondásosnak is tűnhet, hiszen a konstans attól konstans, hogy nem változik az értéke a program futása alatt.
Ez elméletben így is van. A gyakorlatban azonban más a helyzet. A Python ugyanis nem biztosít alapban külön típust a konstansok definiálásához. Konstanst létrehozni egy szokványos változóhoz történő értékadással lehet azzal a konvencióval, hogy ilyenkor a változó nevét csupa nagybetűvel írjuk. Ez azonban csupán egy figyelemfelhívás a kód olvasójának vagy használójának, hogy e változó értékét nem szabad módosítani. Egy névadási konvenció azonban nem véd meg egy esetleges véletlen felülírástól.
De nem kell beletörődni ebbe a helyzetbe, mert ha félünk, hogy a konstansok értéke bármilyen okból esetleg megváltozzon, akkor több megoldás is kínálkozik arra, hogy felülírhatatlan konstansokat hozzunk létre.
Az alábbiakban három eltérő megoldást láthatunk.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 1. megoldás: mezőneves tuple (namedtuple) mezőiként. import math from collections import namedtuple konst = namedtuple('Konstant', 'pi π e euler_szám', defaults=(math.pi, math.pi, math.e, math.e))() # TESZT print(konst.pi, konst.π, konst.e, konst.euler_szám) # Eredmény: # 3.141592653589793 3.141592653589793 2.718281828459045 2.718281828459045 konst.pi = 3.14 # Eredmény: AttributeError: can't set attribute |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# 2. megoldás # Osztályban tulajdonságokként (property) definiálva. class Konstans: @property def h(self): """Planck állandó.""" return 6.62607015E-34 @property def g(self): """Gravitációs gyorsulás.""" return 9.80665 # TESZT konst = Konstans() print(konst.h, konst.g) # Eredmény: 6.62607015e-34 9.80665 konst.h = 6 # Eredmény: AttributeError: can't set attribute |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# 3. megoldás # Dataclass osztályban attribútumokként frozen=True értékkel. from dataclasses import dataclass @dataclass(frozen=True) class Konstans: R = 8.31446261815324 # Egyetemes gázállandó. G = 6.6742867e-11 # Univerzális gravitációs állandó # TESZT konst = Konstans() print(konst.R, konst.G) # Eredmény: 8.31446261815324 6.6742867e-11 konst.G = 9 # Eredmény: # dataclasses.FrozenInstanceError: cannot assign to field 'G' |
Az első egy mezőneves tuple (named tuple) objektumot használ, amelynek egyes mezői lesznek a különböző konstansok nevei. A defaults argumentumaként pedig a konstans értékeit soroljuk fel. A példa azt is mutatja, hogy egy konstanst különböző nevekkel is hivatkozhatjuk, akár a matematikában megszokott görög betűkkel is, minthogy a Python megengedi, hogy az azonosítók Unicode karaktereket tartalmazzanak. (Erről egy korábbi bejegyzésben már szó volt.)
A második megoldás egy hagyományos osztálydefinícióban csak olvasható tulajdonságokként (property) határozza meg a konstansokat.
A harmadik megoldásban egy adatosztály (data class) attribútumai képezik a konstansokat. Azt, hogy ezeket ne lehessen felülírni úgy oldjuk meg, hogy a dataclass dekorátor frozen paraméterének a True értéket adjuk.
A három megoldásban szereplő nyelvi elemek részletes leírását és példákkal illusztrált használatát a Python tudásépítés lépésről lépésre című e-könyv természetesen tartalmazza.