Как правильно запустить метод внутри метода в классе (python) - PullRequest
2 голосов
/ 16 марта 2019

def main ():

class BMI:

    def __init__(self, firstName, lastName, age, height, weight):
        self.firstName = firstName
        self.lastName = lastName
        self.fullName = firstName + " " + lastName
        self.age = age
        self.height = (height * 0.025) ** 2
        self.weight = weight * 0.45

    def setFullName(self, firstName, lastName):
        self.firstName = firstName
        self.lastName = lastName
        self.fullName = firstName + " " + lastName

        print(self.fullName)

    def setAge(self, age):
        self.age = age

    def setHeight(self, height):
        self.height = (height * 0.025) ** 2

    def setWeight(self, weight):
        self.weight = weight * 0.45

    def getBMI(self):
        bmi = self.weight // self.height
        return bmi

    def getStatus(self):

        getBMI()

        if bmi < 19:
            print("You have an unhealthy BMI, gain some weight!")
        elif bmi > 19 and bmi < 25:
            print("You have a healthy BMI")
        else:
            print("You have an unhealthy BMI, lose some weight!")


firstName = input("Enter your first name: ")

lastName = input("Enter your last name: ")

age = int(input("Enter your age: "))

height = int(input("Enter your height in inches: "))

weight = int(input("Enter your weight in lbs: "))

userInputBMI = BMI(firstName, lastName, age, height, weight)


print(userInputBMI.setFullName(firstName, lastName))

print("Your BMI is:", userInputBMI.getBMI())

print(userInputBMI.getStatus())

main ()

Моя проблема заключается в печати статуса пользователя на основе вводимых им данных.Проблема возникает из-за метода, запускаемого в методе getStatus.

Я думаю, что из этого метода в getStatus он получает bmi, который измеряется в операторах if-elif-else.Компьютер говорит, что «getBMI» не определен.Если бы кто-то мог научить меня, как правильно использовать методы, как я пытаюсь, это было бы здорово!

Ответы [ 2 ]

1 голос
/ 16 марта 2019

Вы должны сообщить Python, что внутри вашего getStatus метода вы хотите получить доступ к вашему getBMI методу из того же класса, а не к функции (или любому другому вызываемому объекту) с именем getBMI, которая определена внетвой класс.Вы делаете это, ссылаясь на метод как self.getBMI внутри вашего класса, например:

def getStatus(self): 

    bmi = self.getBMI()

Обратите внимание, что я также поймал возвращаемое значение getBMI, потому что в противном случае это значение будет потеряно.bmi - это просто локальная переменная внутри метода getBMI, которая будет забыта после его завершения, если только вы:

  • не вернете это значение и перехватите возврат с другой переменной при выполнении метода;
  • сохраните его как атрибут экземпляра, написав (в какой-то момент) self.bmi = bmi внутри вашего getBMI метода.

Я бы выбрал первый вариант, так как он делаетсмысл для метода с именем getBMI, чтобы вернуть bmi.Также немного проще испортить и забыть, какой атрибут какой, если вы постоянно пишете и переписываете атрибуты экземпляра - хотя иногда именно поэтому вы будете использовать объекты и классы в первую очередь.

1 голос
/ 16 марта 2019

изменить строку:

    getBMI()

до

    bmi = self.getBMI()

У меня многолетний опыт программирования, но я изучаю Python как новый язык, как и вы. Поправьте меня, пожалуйста, если я ошибаюсь или вам есть, что добавить. Вот мое предложение о правильном использовании методов и языка:

  1. Прочтите о соглашении об именах в Python: имена функций и переменные строчные, методы и переменные экземпляров тоже.
  2. Нет необходимости предварительно вычислять и иметь переменную экземпляра full_name: просто вычислите и верните ее, когда она вам понадобится.
  3. Не конвертируйте высоту в какую-либо часть квадратной формулы высоты и держите ее под именем height. Просто рассчитайте ИМТ из роста и веса, когда вам это нужно, и по формуле ИМТ из дюймов и фунтов.
  4. Сохраните результат вычисления в плавающем порядке, поскольку они используют не 19, а 18,5 в качестве порогового значения.
  5. Нет необходимости указывать setAge, setHeight, setWeight в вашем кодовом вопросе, поскольку вам это пока не нужно и пока не используете его в программе. На самом деле, если вы думаете: set_height и set_weight (Python naming), вам вообще не нужно ничего предоставлять. Вы создаете экземпляр лица, и он остается постоянным. То же самое возможно с set_age, пока вы не создадите какую-нибудь симуляционную игру, когда ваши экземпляры будут стареть.
  6. Печать должна быть за пределами вашего класса. Вы просите вернуть значение или строку, если вам нужно что-то отобразить или напечатать.
  7. И последнее, но не менее важное: немедленно подумайте о тестировании и сначала напишите функцию тестирования. Очень скучно вводить имя, фамилию, возраст, рост и вес ... снова и снова ... QA позже повторно использует ваш тест для модульного тестирования.

Вот мое предложение в виде кода (я специально оставил одну ошибку - думаю, ее будет легко поймать. Извините, если их больше одного - никто не идеален):

class BodyMassIndex:

    BMI_STATUS_LOSE = 0
    BMI_STATUS_HEALTHY = 1
    BMI_STATUS_GAIN = 2

    def __init__(self, first_name, last_name, age, height, weight):
        self._first_name = first_name
        self._last_name = last_name
        self._age = age
        self._height = height
        self._weight = weight

    def get_full_name(self):
        return self._first_name + " " + self._last_name

    def get_bmi(self):
        return (self._weight * 703) / self._height ** 2

    def get_status(self):
        bmi = self.get_bmi()
        if bmi < 18.5:
            status = BodyMassIndex.BMI_STATUS_LOSE
        elif bmi < 25.0:
            status = BodyMassIndex.BMI_STATUS_HEALTHY
        else:
            status = BodyMassIndex.BMI_STATUS_GAIN
        return status

    def get_report(self):
        a = self.get_full_name()
        b = "Your BMI is: {0:.1f}".format(self.get_bmi())
        status_name = ['n unhealthy BMI, lose some weight!',
                       ' healthy BMI',
                       'n unhealthy BMI, gain some weight!']
        c = 'You have a' + status_name[self.get_status()]
        return a + '\n' + b + '\n' + c


if __name__ == '__main__':

    def first_test():
        user_test_list = [
            ("Alex", "Fat",    21, 69, 170, 2),
            ("Josh", "Smart",  17, 69, 169, 1),
            ("Ann", "Full",    19, 69, 126, 1),
            ("Mary", "Skinny", 19, 69, 125, 0),
        ]
        for first, last, age, height, weight, expected in user_test_list:
            user = BodyMassIndex(first, last, age, height, weight)
            print(user.get_report())
            print()

    first_test()

    while True:
        first = input("Enter your first name: ")
        if not first:
            break
        last = input("Enter your last name: ")
        age = int(input("Enter your age: "))
        height = int(input("Enter your height in inches: "))
        weight = int(input("Enter your weight in lbs: "))
        user = BodyMassIndex(first, last, age, height, weight)
        print(user.get_report())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...