Diferència entre revisions de la pàgina «Python: variables estàtiques o de classe»

De Cacauet Wiki
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 ===
+
== 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.


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