Diferència entre revisions de la pàgina «Python: variables estàtiques o de classe»
Salta a la navegació
Salta a la cerca
(Es crea la pàgina amb «Una variables de classe o "estàtica" és una variable comuna per totes les instàncies d'una classe. Els atributs o variables son: * D'instància: valor particular per …».) |
|||
| Línia 1: | Línia 1: | ||
Una variables de classe o "estàtica" és una variable comuna per totes les instàncies d'una classe. | Una variables de classe o "estàtica" és una variable comuna per totes les instàncies d'una classe. | ||
| + | |||
| + | == Teoria == | ||
Els atributs o variables son: | Els atributs o variables son: | ||
* D'instància: valor particular per una instància (els habituals). | * D'instància: valor particular per una instància (els habituals). | ||
| Línia 10: | Línia 12: | ||
Aplicacions típiques: | Aplicacions típiques: | ||
| + | * Carregar en memòria elements comuns de la classe (p.ex. imatges) | ||
* Controlar el nombre d'instàncies creades | * Controlar el nombre d'instàncies creades | ||
* Tenir una instància única d'un objecte (singleton), p.ex. QApplication | * Tenir una instància única d'un objecte (singleton), p.ex. QApplication | ||
| Línia 17: | Línia 20: | ||
| − | + | == Comptar el nombre d'instàncies creades == | |
Per exemple, si tenim una interfície gràfica i volem saber quants botons hem creat: | Per exemple, si tenim una interfície gràfica i volem saber quants botons hem creat: | ||
<syntaxhighlight lang="python"> | <syntaxhighlight lang="python"> | ||
| Línia 33: | Línia 36: | ||
>>> print b1.total,b2.total | >>> print b1.total,b2.total | ||
(2, 2) | (2, 2) | ||
| + | |||
| + | |||
| + | === Altres formes de fer el mateix === | ||
| + | Utilitzant hasattr: | ||
| + | <syntaxhighlight lang="python"> | ||
| + | class Boto: | ||
| + | def __init__(self): | ||
| + | if hasattr(self.__class__,"total"): | ||
| + | self.__class__.total += 1 | ||
| + | else: | ||
| + | self.__class__.total = 1 | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | Utilitzant excepcions: | ||
| + | <syntaxhighlight lang="python"> | ||
| + | class Boto4: | ||
| + | def __init__(self): | ||
| + | try: | ||
| + | self.__class__.total += 1 | ||
| + | except: | ||
| + | self.__class__.total = 1 | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | <br> | ||
| + | |||
| + | == Comportaments inesperats == | ||
| + | ULL, perquè posar una variable en la definició de la classe no ens assegura que sigui una variable comuna a totes. | ||
| + | |||
| + | <div class="exercici">Si em vull assegurar que estic tocant la variable de classe cal accedir-hi a través de '''<classe/instancia>.__class__.<attr>''' | ||
| + | </div> | ||
| + | |||
| + | <br> | ||
| + | |||
| + | == Mètodes estàtics == | ||
| + | Puc definir un mètode estàtic en un objecte mitjançant el ''decorator'' '''@staticmethod'''. | ||
| + | |||
| + | Podré accedir a les variables de classe directament sense el __class__, utilitzant el nom de la classe: | ||
| + | |||
| + | <syntaxhighlight lang="python"> | ||
| + | class Boto: | ||
| + | total = 0 | ||
| + | def __init__(self): | ||
| + | self.inicialitza() | ||
| + | |||
| + | @staticmethod | ||
| + | def inicialitza(): | ||
| + | Boto.total += 1 | ||
| + | </syntaxhighlight> | ||
Revisió del 15:27, 16 des 2013
Una variables de classe o "estàtica" és una variable comuna per totes les instàncies d'una classe.
Contingut
Teoria
Els atributs o variables son:
- D'instància: valor particular per una instància (els habituals).
- De classe: atribut compartit per totes les instàncies.
Referències:
Aplicacions típiques:
- Carregar en memòria elements comuns de la classe (p.ex. imatges)
- Controlar el nombre d'instàncies creades
- Tenir una instància única d'un objecte (singleton), p.ex. QApplication
- ...
Accedirem a les variables d'instància a través de <classe>.__class__.<atribut>
Comptar el nombre d'instàncies creades
Per exemple, si tenim una interfície gràfica i volem saber quants botons hem creat:
class Boto:
total = 0
def __init__(self):
self.__class__.total += 1
Aquest atribut serà comú per totes les instàncies:
>>> b1 = Boto() >>> b1.total 1 >>> b2 = Boto() >>> print b1.total,b2.total (2, 2)
Altres formes de fer el mateix
Utilitzant hasattr:
class Boto:
def __init__(self):
if hasattr(self.__class__,"total"):
self.__class__.total += 1
else:
self.__class__.total = 1
Utilitzant excepcions:
class Boto4:
def __init__(self):
try:
self.__class__.total += 1
except:
self.__class__.total = 1
Comportaments inesperats
ULL, perquè posar una variable en la definició de la classe no ens assegura que sigui una variable comuna a totes.
Si em vull assegurar que estic tocant la variable de classe cal accedir-hi a través de <classe/instancia>.__class__.<attr>
Mètodes estàtics
Puc definir un mètode estàtic en un objecte mitjançant el decorator @staticmethod.
Podré accedir a les variables de classe directament sense el __class__, utilitzant el nom de la classe:
class Boto:
total = 0
def __init__(self):
self.inicialitza()
@staticmethod
def inicialitza():
Boto.total += 1