Cornichon avec des classes personnalisées
Supposons que j'ai un simple python définition de la classe dans un fichier myClass.py
class Test:
A = []
Et j'ai également deux scripts de test. Le premier script crée un objet de type Test, remplit la matrice A, et les cornichons le résultat dans un fichier. Immédiatement unpickles à partir du fichier et le tableau est toujours remplie.
Le second script juste unpickles à partir du fichier, et le tableau n'est pas rempli (c'est à dire A == []). Pourquoi est-ce?
test1.py
import myClass
import pickle
x = myClass.Test()
for i in xrange(5):
x.A.append(i)
f = open('data', 'w')
pickle.dump(x,f)
f.close()
f = open('data')
y = pickle.load(f)
f.close
print y.A
et test2.py
import myClass
import pickle
f = open('data')
y = pickle.load(f)
f.close
print y.A
OriginalL'auteur Joe | 2012-05-31
Vous devez vous connecter pour publier un commentaire.
C'est parce que vous êtes réglage
Test.A
comme un attribut de classe à la place d'une instance de l'attribut. Vraiment ce qui se passe est que, avec le test1.py, l'objet de la lecture à partir de la saumure fichier est le même que test2.py mais son utilisation de la classe dans la mémoire où vous avez eu à l'origine affectéx.A
.Quand vos données sont unpickled à partir du fichier, il crée une nouvelle instance de la classe type, puis applique quel que soit les données de l'instance. Mais votre seul de données est un attribut de classe. Son toujours en se référant à la classe des thats en mémoire, que vous avez modifié dans l'un, mais pas dans un autre fichier.
Comparer les différences dans cet exemple:
Vous remarquerez que l'instance de l'attribut
a
sera décapé et unpickled correctement, alors que l'attribut de classeA
va tout simplement se référer à la classe dans la mémoire.pickle.dump(Test)
, puis unpickled la classe, vous auriez eu la bonne listeA
de retour dans les deux cas?non, il ne préserve pas l'attribut de classe, comme par qu'est-ce-peut-être-mariné-et-unpickled: "les classes sont marinés avec le nom de référence, de sorte que les mêmes restrictions dans le unpickling de l'environnement s'appliquent. Notez qu'aucun de la classe de code ou de données est décapé"
Que faire si la variable de classe et la variable d'instance avait le même nom, le cornichon choisir la classe ou de la variable d'instance?
Si vous définissez une variable d'instance
A
ensuite, il serait de l'ombre de la variable de classeA
. À ce stade, vous avez une valeur qui est divorcé de la variable de classe, de toute façon. Donc la réponse est que vous obtenez la variable d'instance valeurs lorsque vous cornichon/unpickleOriginalL'auteur jdi