numeros - str en python
¿Puede una simple diferencia en los nombres de las variables de Python3 alterar la forma en que se ejecuta el código? (1)
Sí, aunque no es tanto el nombre de la variable que causa esto, no directamente.
Cuando Python sale, todos los módulos también se eliminan. La forma en que se limpian los módulos es estableciendo todos los globales en un módulo en None
(por lo que esas referencias ya no se refieren a los objetos originales). Esos valores globales son claves en un objeto de diccionario, y como los diccionarios se ordenan arbitrariamente, el cambio de nombre de una variable puede cambiar el orden en que se borran las variables.
Cuando cambió el nombre de v
a vb
, modificó el orden en que se borraron las variables, y ahora la Person
se borra al último.
Una type(self).num_of_people -= 1
es usar type(self).num_of_people -= 1
en el método __del__
lugar:
def __del__(self):
type(self).num_of_people -= 1
porque la instancia siempre tendrá una referencia a la clase fija, o prueba si la Person
no está configurada en None
:
def __del__(self):
if Person is not None:
Person.num_of_people -= 1
Dos notas:
CPython 3.4 ya no establece globales en
None
(en la mayoría de los casos), según la Finalización de Objeto seguro ; ver PEP 442 .CPython 3.3 aplica automáticamente una sal hash aleatorizada a las claves
str
utilizadas en un diccionarioglobals
; esto hace que el comportamiento que observó sea aún más aleatorio, simplemente volver a ejecutar su código varias veces puede o no desencadenar el mensaje de error.
Esta pregunta ya tiene una respuesta aquí:
- Python attributeError on __del__ 1 respuesta
Este código ...
class Person:
num_of_people = 0
def __init__(self, name):
self.name = name
Person.num_of_people += 1
def __del__(self):
Person.num_of_people -= 1
def __str__(self):
return ''Hello, my name is '' + self.name
cb = Person(''Corey'')
kb = Person(''Katie'')
v = Person(''Val'')
Produce el siguiente error ...
Exception AttributeError: "''NoneType'' object has no attribute ''num_of_people''" in <bound method Person.__del__ of <__main__.Person object at 0x7f5593632590>> ignored
Pero este código no.
class Person:
num_of_people = 0
def __init__(self, name):
self.name = name
Person.num_of_people += 1
def __del__(self):
Person.num_of_people -= 1
def __str__(self):
return ''Hello, my name is '' + self.name
cb = Person(''Corey'')
kb = Person(''Katie'')
vb = Person(''Val'')
La única diferencia que veo es que el último nombre de variable es "vb" vs. "v".
Me estoy inclinando Python y estoy trabajando en las cosas OOP ahora.