'>=' not supported between instances of 'method' and 'int'

Question:

Here is the method causing the error:

class Kilpailu():
    def __init__(self, nimi, pituuskm, osallistujat):
        self.nimi = nimi
        self.pituuskm = pituuskm
        self.osallistujat = osallistujat

    def kilpailu_ohi(self):
        for i in self.osallistujat:
            if (i.getKuljettuMatka>=self.pituuskm):
                return True
            else:
                return False

edit: here is also where getKuljettuMatka is defined

class Auto:
    def __init__(self, rekisteritunnus, huippunopeus):
        self.rekisteritunnus = rekisteritunnus
        self.huippunopeus=huippunopeus
        self.nopeus=0
        self.KuljettuMatka=0
    def getKuljettuMatka(self):
        return int(self.KuljettuMatka)

I am trying to call the method that just returns a boolean value and print whether the value is true or false.

class main():
    autot = []
    for i in range(10):
        auto = Auto("ABC-" + str(i + 1), random.randint(100, 200))
        autot.append(auto)

    k = Kilpailu("Suuri romuralli", 8000, autot)
    tunnit = 0
    print(k.kilpailu_ohi()) #Should return true/false, instead throws an error

and here is the actual console output for the error

Traceback (most recent call last):
  File "/root/PycharmProjects/ohjelmisto1/Harjoitustehtävät/Assosisaatio/autoKilpailu.py", line 51, in <module>
    class main():
  File "/root/PycharmProjects/ohjelmisto1/Harjoitustehtävät/Assosisaatio/autoKilpailu.py", line 59, in main
    print(k.kilpailu_ohi())
  File "/root/PycharmProjects/ohjelmisto1/Harjoitustehtävät/Assosisaatio/autoKilpailu.py", line 45, in kilpailu_ohi
    if (i.getKuljettuMatka>=self.pituuskm):
TypeError: '>=' not supported between instances of 'method' and 'int'

I have tried changing stuff in the method like variable names in case i was accidentally overwriting something but it didnt work either

Asked By: Mirzu42

||

Answers:

def getKuljettuMatka(self): defines .getKuljettuMatka on instances of Auto as a method (that happens to return an integer). You can call the method with i.getKuljettuMatka() (note the parentheses), but what you’re doing is comparing the method itself to self.pituuskm, which is an integer, and that doesn’t work.

Instead:

    def kilpailu_ohi(self):
        for i in self.osallistujat:
            if (i.getKuljettuMatka() >= self.pituuskm):
                return True
            else:
                return False

By the way, I think the code is a bit roundabout in other ways, but this is you main issue right now.

Answered By: Grismar