#python
#python
Вопрос:
В настоящее время я работаю над проектами hyperskill. Способ, которым я выполнил этот код, вероятно, не идеален, но я просто пытаюсь работать со списками / классами / объектами по ходу дела.
В Pycharm он выделяет все self.методы в операторе if с помощью «объект ‘int’ не вызывается» (или float) — но код работает так, как ожидалось? Интересно, почему это было бы.
Помещение self.everything в init с = None приводит к исчезновению выделения / предупреждения, но код не работает.
Это также мой первый вопрос, извините, если он слишком широкий. Я пытался искать ответы на другие вопросы. Также не уверен, должен ли я вставлять весь код, поскольку я не уверен, какая часть имеет значение.
from math import ceil, floor, pow, log
class LoanCalc:
options = ['Enter the loan principal:', 'Enter the monthly payment', 'Enter the loan interest:',
'Enter the number of periods:', 'Enter the annuity payment:']
def __init__(self):
pass
def loan_principle(self):
self.loan_principle = int(input(self.options[0]))
def monthly_payment(self):
self.monthly_payment = int(input(self.options[1]))
def loan_interest(self):
self.loan_interest = float(input(self.options[2]))
def i(self):
self.i = self.loan_interest / (12 * 100)
def periods(self):
self.periods = int(input(self.options[3]))
def a(self):
self.a = float(input(self.options[4]))
def main(self):
inp_options = input('''
What do you want to calculate?
type "n" - for number of monthly payments,
type "a" for annuity monthly payment amount,
type "p" - for the monthly payment:
''')
if inp_options == 'n':
self.loan_principle()
self.monthly_payment()
self.loan_interest()
self. i()
n_months = log(self.monthly_payment /
(self.monthly_payment - self.i * self.loan_principle), 1 self.i)
years = 0
if n_months < 11:
print(f'It will take {ceil(n_months)} months to repay this loan!')
elif n_months >= 12:
while n_months > 11:
n_months -= 12
years = 1
print(f'It will take {years} years and {ceil(n_months)} months to repay this loan!')
elif inp_options == 'p':
self.a()
self.periods()
self.loan_interest()
self. i()
loan_principal = self.a / ((self.i * ((1 self.i) ** self.periods)) / (((1 self.i) ** self.periods) - 1))
print(f'Your loan principal = {floor(loan_principal)}!')
elif inp_options == 'a':
self.loan_principle()
self.periods()
self.loan_interest()
self. i()
ann = ceil(self.loan_principle * ((self.i * pow(1 self.i, self.periods)) /
(pow(1 self.i, self.periods) - 1)))
print(f'Your monthly payment = {ann}!')
loan_calculator = LoanCalc()
loan_calculator.main()
Комментарии:
1. У вас есть методы с тем же именем, что и атрибуты.
def loan_principle
задает вызываемый атрибутself.loan_principle
, который скрывает имя метода. При определенных обстоятельствах это приведет к ошибкам при дополнительном тестировании. Дайте атрибутам или методам другое имя, чтобы они не конфликтовали. Чтобы увидеть ошибку, попробуйте вызвать один из методов дважды подряд.2. Большое спасибо, что изменение имен исправило это.