es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Comparación de dos objetos que tienen el mismo ancestro.

Tengo 3 clases: Person, Teacher(Person) y Student(Person) y necesito comparar sus objetos.

Lo que estoy haciendo:

class Student(Person):

def __init__(self, name, year_of_birth, age):
    super().__init__(name, year_of_birth, age)
    self.skill= skill

def __eq__(self, st1):
    if self.age == st1.age:
        return True
    return False

def __lt__(self, st1):
    if self.age < st1.age:
        return True
    return False

def __gt__(self, st1):
    if self.age > st1. age:
        return True
    return False 

Y las mismas acciones en la clase ‘Teacher(Person)’ para comparar maestros por su cantidad de años de experiencia.
Y ahora quiero comparar objetos de las clases ‘Student’ y ‘Teacher’ como

student1 == teacher1

y debería obtener ‘False’ porque no se pueden comparar (los estudiantes se comparan por edad, los profesores por experiencia)

Estoy intentando esto en mi clase ‘Person’:

def eq(self, person2):
    if self.class.name == person2.class.name:
        return True
    return False

pero cuando llamo a ‘print(student1 == teacher2)’ obtengo

Traceback (most recent call last):
  File "C:\Users\User1\PycharmProjects\university\main.py", line 95, in <module>
    print(student1 == teacher2)
  File "C:\Users\User1\PycharmProjects\university\main.py", line 71, in __eq__
    if self.years_of_experience == teacher2.years_of_experience:
AttributeError: 'Student' object has no attribute 'years_of_experience'

¿Algún consejo sobre cómo comparar correctamente esos dos objetos y obtener False, porque son objetos de clases diferentes y no se pueden comparar (según mi tarea)?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para comparar objetos de diferentes clases de tal manera que devuelva False porque no se pueden comparar, puedes modificar el método __eq__ en la clase Person para que solo devuelva True si los dos objetos tienen el mismo tipo:

    class Person:
        def __eq__(self, other):
            return type(self) == type(other)
    

    Esto hará que student1 == teacher2 devuelva False porque son de tipos diferentes.

    También puedes modificar los métodos __lt__ y __gt__ de la misma manera para comparar solo objetos del mismo tipo. Alternativamente, puedes generar un TypeError para indicar que los objetos no se pueden comparar:

    class Person:
        def __eq__(self, other):
            if type(self) != type(other):
                raise TypeError("No se pueden comparar objetos de diferentes tipos")
            return True
    
        def __lt__(self, other):
            if type(self) != type(other):
                raise TypeError("No se pueden comparar objetos de diferentes tipos")
            return self.age < other.age  # o self.years_of_experience < other.years_of_experience
    
        def __gt__(self, other):
            if type(self) != type(other):
                raise TypeError("No se pueden comparar objetos de diferentes tipos")
            return self.age > other.age  # o self.years_of_experience > other.years_of_experience
    

    Esto generará un TypeError si intentas comparar objetos de diferentes tipos, y solo comparará los objetos si son del mismo tipo.

Comments are closed.