Python В проверке вместо вызова метода функции используют ссылку на функцию. Как с этим работать?

Мой код:

class Mosquito:
    def __init__(self, age):
        self.age = age
        self.f = ''
        self.lv = ''

    def __str__(self):
        return f"{self.__class__.__name__}, {self.age} days"

    def feed(self):
        return self.f

    def lives(self):
        return self.lv


class MaleMosquito(Mosquito):
    def __init__(self, age):
        super().__init__(age)
        self.f = 'nectar'
        self.lv = 'on land'

    def hearing(self):
        return f'I hear and see everything {self.lv}'


class FemaleMosquito(Mosquito):
    def __init__(self, age):
        super().__init__(age)
        self.f = 'blood'
        self.lv = 'on land'

    def squeak(self):
        return f'The thin squeak of a mosquito after eating {self.f}'


class MosquitoLarva(MaleMosquito, FemaleMosquito):
    def __init__(self, age):
        super().__init__(age)
        self.f = 'algae'
        self.lv = 'in water' 

Проверяющая система:

mm = MaleMosquito(19)
fm = FemaleMosquito(42)
ml = MosquitoLarva(3)
for item in (mm, fm, ml):
    print(f'{item}, I feed {item.feed}, I lives {item.lives}')
m = Mosquito(13)
print(m)

Нужный вывод:

MaleMosquito, 19 days, I feed nectar, I lives on land
FemaleMosquito, 42 days, I feed blood, I lives on land
MosquitoLarva, 3 days, I feed algae, I lives in water
Mosquito, 13 days

Мой вывод:

MaleMosquito, 19 days, I feed <bound method Mosquito.feed of <solution.MaleMosquito object at 0x2b4eb87eefd0>>, I lives <bound method Mosquito.lives of <solution.MaleMosquito object at 0x2b4eb87eefd0>>
FemaleMosquito, 42 days, I feed <bound method Mosquito.feed of <solution.FemaleMosquito object at 0x2b4eb87eedc0>>, I lives <bound method Mosquito.lives of <solution.FemaleMosquito object at 0x2b4eb87eedc0>>
MosquitoLarva, 3 days, I feed <bound method Mosquito.feed of <solution.MosquitoLarva object at 0x2b4eb87eed60>>, I lives <bound method Mosquito.lives of <solution.MosquitoLarva object at 0x2b4eb87eed60>>
Mosquito, 13 days

Сменить систему проверки я не могу.


Ответы (3 шт):

Автор решения: Sylvia-Anna

Так как возвращается ссылка на функцию, то эту функцию можно вызвать. Добавьтe скобки к Вашей ссылке.

for item in (mm, fm, ml):
    print(f'{item}, I feed {item.feed()}, I lives {item.lives()}')
→ Ссылка
Автор решения: Pavlo Khyzhniak
class MaleMosquito(Mosquito):
        def __init__(self, age):
            super().__init__(age)
            self.f = 'nectar'
            self.lv = 'on land'
            self.feed = feed()
            self.lives = lives()
→ Ссылка
Автор решения: CrazyElf

Можно использовать "свойства" класса - просто добавьте декоратор @property к этим методам:

    @property
    def feed(self):
        return self.f
    
    @property
    def lives(self):
        return self.lv

Вывод:

MaleMosquito, 19 days, I feed nectar, I lives on land
FemaleMosquito, 42 days, I feed blood, I lives on land
MosquitoLarva, 3 days, I feed algae, I lives in water
Mosquito, 13 days
→ Ссылка