Python | Evitar datos de clase compartidos entre las instancias

Los atributos de clase pertenecen a la clase en sí y serán compartidos por todas las instancias y, por lo tanto, contienen el mismo valor de cada instancia. Dichos atributos se definen en las partes del cuerpo de la clase, generalmente en la parte superior, para facilitar la legibilidad. 

Supongamos que tenemos el siguiente fragmento de código:

Python3

# Python code to demonstrate
# the working of the sharing
# of data variables
 
# Creating a class
class Geek_Class:
    geek = []
 
x = Geek_Class()
y = Geek_Class()
 
# Appending the values
x.geek.append(1)
y.geek.append(2)
x.geek.append(3)
y.geek.append(4)
 
# Printing the values for x and y
print(x.geek)
print(y.geek)
Producción: 

[1, 2, 3, 4]
[1, 2, 3, 4]

 

Imprime [1, 2, 3, 4] para x y [1, 2, 3, 4] para y. Supongamos que la salida que queremos es [1, 3] para x y [2, 4] para y. Podemos obtener la salida deseada de las siguientes maneras: 

Método #1 : al declararlas dentro de __init__
Declarar las variables dentro de la declaración de clase las convierte en miembros de clase y no en miembros de instancia. Declararlos dentro del método __init__ garantiza que se cree una nueva instancia de los miembros junto con cada nueva instancia del objeto, que es lo que necesitamos.

Python3

# Python code to demonstrate
# the working of the sharing
# of data variables
 
# Creating a class inside __init__
class Geek_Class:
    def __init__(self):
        self.geek = []
 
x = Geek_Class()
y = Geek_Class()
 
# Appending the values
x.geek.append(1)
y.geek.append(2)
x.geek.append(3)
y.geek.append(4)
 
# Printing the values for x and y
print(x.geek)
print(y.geek)
Producción: 

[1, 3]
[2, 4]

 

En el código original no se asigna ningún valor al atributo de lista después de la creación de instancias; por lo que sigue siendo un atributo de clase. Definir la lista dentro de __init__ funciona porque __init__ se llama después de la creación de instancias. 
  
Método #2: Creando la nueva lista y almacenando los valores en ella.

Python3

# Python code to demonstrate
# the working of the sharing
# of data variables
 
# Creating a class
class Geek_Class:
    geek =[]
 
x = Geek_Class()
y = Geek_Class()
 
# Creating the new lists
x.geek = []
y.geek = []
 
# Appending the values
x.geek.append(1)
y.geek.append(2)
x.geek.append(3)
y.geek.append(4)
 
# Printing the values for x and y
print(x.geek)
print(y.geek)
Producción: 

[1, 3]
[2, 4]

 

Publicación traducida automáticamente

Artículo escrito por Shambhavi Singh 1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *