python3 - ¿Cómo copiar todas las instancias de Python a una nueva clase?
python copy of variable (2)
Si solo te importan los valores (atributos) de la clase, creo que puedes llamar al método __dict__
para obtenerlos.
In [1]: class Foo():
...: pass
...:
In [2]: foo = Foo()
In [3]: foo.bar1 = ''derp''
In [4]: foo.bar2 = ''derp derp''
In [5]: foo.__dict__
Out[5]: {''bar1'': ''derp'', ''bar2'': ''derp derp''}
Si esto es lo que pregunta, aquí hay una pregunta relacionada: Listar atributos de un objeto
Me gustaría hacer una copia en profundidad de todas las instancias de una clase, pero sin copiar las definiciones y reglas de una clase determinada.
El uso previsto es, dado que tengo la clase "OriginalClass", sus instancias son las variables que estoy almacenando. Mientras el programa continúa, quiero poder utilizar las "instantáneas" anteriores de OriginalClass, de las cuales solo utilizaré los valores (no almacenaré nuevas allí, por lo que no se necesitan reglas para heredar).
El ejemplo simple anterior funciona, y es muy similar a lo que quiero hacer:
import copy
class VM:
#nothing in the class
pass
VM1=VM()
VM1.test=dict()
VM1.test[''one'']="hello"
def printmytext(VMPast=copy.deepcopy(VM1)):
g.es(VMPast.test[''one''])
VM1.test="Bye"
printmytext() #Returns "hello"
Pero la idea sería sustituir:
VMPast=copy.deepcopy(VM1)
Para el código de trabajo, no sé cómo escribir, que copiará las instancias y los diccionarios, pero no las definiciones.
La razón es que cuando uso la versión de Deepcopy en mi programa (de esta manera :)
VMPast=copy.deepcopy(VM1)
VM1.MyMethod(VMPast.MyButton[-1])
arroja el siguiente error:
AttributeError: AttributeSetter instance has no __call__ method
Porque el valor de:
VMPast.MyButton[-1]
Ha sido enviado como:
''__deepcopy__''
En lugar del valor real sustituido, yo pretendo ... (el botón), así que si VMPast ya era una copia de trabajo de las instancias dentro de la máquina virtual, ¡esto funcionaría mucho más que con la copia de retorno! Otra cosa es que las instancias son dinámicas, no sé de antemano los nombres o valores que la clase original tendrá en ese momento. ¡Muchas gracias!
Una copia profunda nunca copia la definición de clase, solo los atributos de instancia.
En su lugar, crea una nueva instancia. Las instancias de Python solo contienen una referencia a la definición de clase. Simplemente llame a MyMethod
en esa instancia:
VMPast.MyMethod()
siempre que la clase tenga dicho método.
Es su clase específica que evita una copia profunda exitosa:
class VariableManagerClass:
def __getattr__(self, attr):
return AttributeSetter(self, attr)
La función copy.deepcopy()
busca un .__deepcopy__()
en la instancia, y su hook __getattr__
su lugar devuelve una clase AttributeSetter
.
Puedes evitar esto probando tu attr
un poco primero:
class VariableManagerClass:
def __getattr__(self, attr):
if attr.startswith(''_''):
raise AttributeError(attr)
return AttributeSetter(self, attr)
Esto indica que su clase no maneja atributos privados o nombres de métodos especiales.