tipos str numeros letras imprimir entrada datos convertir concatenar python oop python-3.x finalizer

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 diccionario globals ; 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í:

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.