Vous avez raison, somedata
est partagée entre toutes les instances de la classe et de ses sous-classes, car elle est créée à la classe définition heure. Les lignes
somedata = {}
somedata['was_false_in_base'] = False
sont exécutées lorsque la classe est définie, à savoir quand l'interprète rencontre la déclaration class
- pas lorsque l'instance est créée (pensez blocs statiques initialiseur en Java). Si un attribut n'existe pas dans une instance de classe, l'objet de classe est vérifié pour l'attribut.
Au moment de la définition de la classe, vous pouvez exécuter du code arbritrary, comme ceci:
import sys
class Test(object):
if sys.platform == "linux2":
def hello(self):
print "Hello Linux"
else:
def hello(self):
print "Hello ~Linux"
Sur un système Linux, Test().hello()
imprimera Hello Linux
, sur tous les autres systèmes de l'autre chaîne sera imprimée.
En constraste, les objets __init__
sont créés à instanciation temps et appartiennent à l'instance que (quand ils sont affectés à self
):
class Test(object):
def __init__(self):
self.inst_var = [1, 2, 3]
objets définis sur un objet de classe plutôt que par exemple peut être utile dans de nombreux cas. Par exemple, vous voudrez peut-être mettre en cache des instances de votre classe, de sorte que les instances avec les mêmes valeurs membres peuvent être partagées (en supposant qu'ils sont censés être immuable):
class SomeClass(object):
__instances__ = {}
def __new__(cls, v1, v2, v3):
try:
return cls.__insts__[(v1, v2, v3)]
except KeyError:
return cls.__insts__.setdefault(
(v1, v2, v3),
object.__new__(cls, v1, v2, v3))
La plupart du temps, j'utiliser des données dans les instances de classe en en conjonction avec des métaclasses ou des méthodes d'usine génériques.
Comment déclarer une instance var alors? – OscarRyz
J'ai ajouté un exemple dans ma réponse. –
Y a-t-il une différence entre des données simples et complexes? comme dit TimB? – OscarRyz