Creando Objetos Distintos en Python Utilizando Bucles
Tengo el siguiente código Python:
from names import getfirstname, getlastname
class Person(object):
def init(self, firstname=getfirstname(), lastname=getlastname()):
self.firstname = firstname
self.lastname = lastname
def makegroupofpeople(numpeople):
people = []
num = 0
while num < numpeople:
person = Person(
firstname=getfirstname(),
lastname=getlast_name(),
)
people.append(person)
num += 1
return people
group = makegroupof_people(3)
for person in group:
print(f"NEW PERSON {group.index(person)}")
print(person.firstname)
print(person.lastname)
Lo que imprime diferentes nombres, así:
NUEVA PERSONA 0
Christine
Thomas
NUEVA PERSONA 1
Orlando
Goff
NUEVA PERSONA 2
William
Bedwell
Lo que no entiendo es que cuando ejecuto este código Python muy similar:
“`python
from names import getfirstname, getlastname
class Person():
def init(self, firstname=getfirstname(), lastname=getlastname()):
self.firstname = firstname
self.lastname = lastname
def makegroupofpeople2(numpeople):
people = []
num = 0
while num < numpeople:
person = Person() ### AQUÍ ESTÁ LO QUE ES DIFERENTE ###
people.append(person)
num += 1
return people
samenamedgroup = makegroupofpeople2(3)
for person in samenamedgroup:
print(f”NUEVA PERSONA {same_named_group.index(person)}”)
print(person.firstname)
print(person.lastname)
Obtengo esta salida, lo que indica que cada objeto tiene los nombres y apellidos:
NUEVA PERSONA 0
Michael
Baylock
NUEVA PERSONA 1
Michael
Baylock
NUEVA PERSONA 2
Michael
Baylock
Lo que me confunde es que esperaría que ambos fragmentos de código imprimieran nombres diferentes, ya que en ambos casos los valores predeterminados denombre de pila yapellido de laclasePersona son los resultados de las funciones generadoras de nombre aleatorio del paquete de nombres, pero claramente eso no es lo que está sucediendo.
He visto esta pregunta, pero no responde completamente lo que estoy viendo.
¿Alguna idea de por qué sucede esto? ¿Y es esto consistente en todos los lenguajes de programación orientados a objetos?
davy.ai
La diferencia entre los dos fragmentos de código es que en el primero, la clase
Person
está siendo instanciada con las funcionesget_first_name()
yget_last_name()
como parámetros, mientras que en el segundo, se está instanciando la clasePerson
sin ningún parámetro.La razón por la cual el segundo fragmento de código imprime el mismo nombre para cada objeto es porque las funciones
get_first_name()
yget_last_name()
solo son llamadas una vez, cuando se instanció la clasePerson
por primera vez. Como las funciones no son llamadas nuevamente, se está utilizando el mismo nombre para cada objeto.Este comportamiento es consistente en todos los lenguajes de Programación Orientada a Objetos, ya que se aplica el mismo concepto.