изменить строку:
getBMI()
до
bmi = self.getBMI()
У меня многолетний опыт программирования, но я изучаю Python как новый язык, как и вы. Поправьте меня, пожалуйста, если я ошибаюсь или вам есть, что добавить. Вот мое предложение о правильном использовании методов и языка:
- Прочтите о соглашении об именах в Python: имена функций и переменные строчные, методы и переменные экземпляров тоже.
- Нет необходимости предварительно вычислять и иметь переменную экземпляра full_name: просто вычислите и верните ее, когда она вам понадобится.
- Не конвертируйте высоту в какую-либо часть квадратной формулы высоты и держите ее под именем height. Просто рассчитайте ИМТ из роста и веса, когда вам это нужно, и по формуле ИМТ из дюймов и фунтов.
- Сохраните результат вычисления в плавающем порядке, поскольку они используют не 19, а 18,5 в качестве порогового значения.
- Нет необходимости указывать setAge, setHeight, setWeight в вашем кодовом вопросе, поскольку вам это пока не нужно и пока не используете его в программе. На самом деле, если вы думаете: set_height и set_weight (Python naming), вам вообще не нужно ничего предоставлять. Вы создаете экземпляр лица, и он остается постоянным. То же самое возможно с set_age, пока вы не создадите какую-нибудь симуляционную игру, когда ваши экземпляры будут стареть.
- Печать должна быть за пределами вашего класса. Вы просите вернуть значение или строку, если вам нужно что-то отобразить или напечатать.
- И последнее, но не менее важное: немедленно подумайте о тестировании и сначала напишите функцию тестирования. Очень скучно вводить имя, фамилию, возраст, рост и вес ... снова и снова ... 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())