Home > Net >  Python - Best way to iterate through methods of instances
Python - Best way to iterate through methods of instances

Time:12-15

I'm trying to make a pension tax calculator and have created a class "Client" that will accept inputs from two separate users and calculate their taxes based on these inputs.

Is there a cleaner way for me iterate through each client than to repeat this code?

client1 = Client.from_input()
print(client1.name, 'Maximum pension contribution you can make this tax year: ', client1.get_maximum_contribution())
print(client1.name, 'Maximum pension contribution your employer can make this year: ', client1.get_carryforward()   client1.get_remaining_aa())
print(client1.name, 'Remaining annual allowance: ', client1.get_remaining_aa())
print(client1.name, 'Carryforward available: ', client1.get_carryforward())

client2 = Client.from_input()

print(client2.name, 'Maximum pension contribution you can make this tax year: ', client2.get_maximum_contribution())
print(client2.name, 'Maximum pension contribution your employer can make this year: ', client2.get_carryforward()   client1.get_remaining_aa())
print(client2.name, 'Remaining annual allowance: ', client2.get_remaining_aa())
print(client2.name, 'Carryforward available: ', client2.get_carryforward())

If anybody wants the full code or if it's relevant:

```# import datetime
# currentyear = datetime.date.today().year
# year3 = (datetime.date.today().year - 3)
# year2 = datetime.date.today().year - 2
# year1 = datetime.date.today().year - 1
aathreshold = 240000
aallowance = 40000
maxaareduction = 36000


class Client:
    def __init__(self, name, salary, bonus, intdiv, employeepercent, employerpercent, pensionlump, salaryexchange,
                 deathbenefits, year3contribution, year2contribution, year1contribution):
        self.name = name
        self.salary = salary
        self.bonus = bonus
        self.intdiv = intdiv
        self.employeecontribution = salary * (employeepercent / 100)
        self.employercontribution = salary * (employerpercent / 100)
        self.pensionlump = pensionlump
        self.salaryexchange = salaryexchange
        self.deathbenefits = deathbenefits
        self.totalgross = salary   bonus   intdiv
        self.totalannualpensioncontributions = self.employeecontribution   self.employercontribution   self.pensionlump
        self.year3contribution = year3contribution
        self.year2contribution = year2contribution
        self.year1contribution = year1contribution

    @classmethod
    def from_input(cls):
        return cls(input('Name: '),
                   int(input('Salary   Bonus: ')),
                   int(input('Bonus & Comission: ')),
                   int(input('Interest & Dividends: ')),
                   int(input('Employee gross workplace contribution % : ')),
                   int(input('Employer gross workplace contribution % :')),
                   int(input('Lump sum contributions: ')),
                   int(input('Employment income given through salary exchange')),
                   int(input('Taxed lump sum death benefits: ')),
                   int(input('Please enter your pension contributions for 2018: ')),
                   int(input('Please enter your pension contributions for 2019: ')),
                   int(input('Please enter your pension contributions for 2020: '))
                   )

    def get_carryforward(self):
        def cap_carryforward(contribution):
            if contribution > aallowance:
                contribution = aallowance
                remaining_allowance = aallowance - contribution
                return remaining_allowance
            else:
                remaining_allowance = aallowance - contribution
                return remaining_allowance

        year3remallowance = cap_carryforward(self.year3contribution)
        year2remallowance = cap_carryforward(self.year2contribution)
        year1remallowance = cap_carryforward(self.year1contribution)
        cf_allowance = year3remallowance   year2remallowance   year1remallowance
        return cf_allowance

    def get_threshold(self):
        threshinc = self.totalgross - self.pensionlump - self.employeecontribution\
                      self.salaryexchange - self.deathbenefits
        return threshinc

    def get_adjustedincome(self):
        adjustedinc = self.totalgross   self.employercontribution - self.deathbenefits
        return adjustedinc

    def get_remaining_aa(self):
        taperexcess = 0
        if Client.get_adjustedincome(self) > aathreshold:
            taperexcess = (Client.get_adjustedincome(self) - aathreshold) / 2
            if taperexcess > maxaareduction:
                taperexcess = maxaareduction
        annualallowance = aallowance - taperexcess
        remaining_aa = annualallowance - self.totalannualpensioncontributions
        if remaining_aa <= 0:
            remaining_aa = 0
        return remaining_aa

    def get_maximum_contribution(self):
        combinedallowance = (Client.get_remaining_aa(self)   Client.get_carryforward(self))
        if (self.salary - combinedallowance) <= 0:
            maxcontribution = self.salary
            return maxcontribution
        elif (self.salary - combinedallowance) > 0:
            maxcontribution = combinedallowance
            return maxcontribution



client1 = Client.from_input()
print(client1.name, 'Maximum pension contribution you can make this tax year: ', client1.get_maximum_contribution())
print(client1.name, 'Maximum pension contribution your employer can make this year: ', client1.get_carryforward()   client1.get_remaining_aa())
print(client1.name, 'Remaining annual allowance: ', client1.get_remaining_aa())
print(client1.name, 'Carryforward available: ', client1.get_carryforward())

client2 = Client.from_input()

print(client2.name, 'Maximum pension contribution you can make this tax year: ', client2.get_maximum_contribution())
print(client2.name, 'Maximum pension contribution your employer can make this year: ', client2.get_carryforward()   client1.get_remaining_aa())
print(client2.name, 'Remaining annual allowance: ', client2.get_remaining_aa())
print(client2.name, 'Carryforward available: ', client2.get_carryforward())

CodePudding user response:

Yes, you can add a __str__ method to your Client-class to define how the string-representation of your objects should look like. E.g.:

import os
...
class Client:
    ...
    def __str__(self):
       line1 = f"{self.name} Maximum pension contribution you can make this tax year: {self.get_maximum_contribution()}"
       line2 = f"{self.name} Maximum pension contribution your employer can make this year:  {self.get_carryforward()   self.get_remaining_aa()}"
       line3 = f"{self.name} Remaining annual allowance:   {self.get_remaining_aa()}"
       line4 = f"{self.name} Carryforward available:   {self.get_carryforward()}"
       return os.linesep.join([line1,line2,line3,line4])

If you do that you can just do print(client1) in your code. Alternatively, you can just name this method getstring and do it like this print(client1.getstring()).

If you want to iterate though your clients you can do it like this:

client_list = [Client.from_input() for _ in range(num_clients)]
for client in client_list:
    print(client)

To create a list of num_clients with your from_input method and print them all out.

CodePudding user response:

def print_info_for_clients(clients):
    for client in clients:
        print(client.name, 'Maximum pension contribution you can make this tax year: ', client.get_maximum_contribution())
        print(client.name, 'Maximum pension contribution your employer can make this year: ', client.get_carryforward()   client.get_remaining_aa())
        print(client.name, 'Remaining annual allowance: ', client.get_remaining_aa())
        print(client.name, 'Carryforward available: ', client.get_carryforward())


client1 = Client.from_input()
client2 = Client.from_input()
print_info_for_clients([client1, client2])

If you wanted to you could move the Client.from_input() into the function, and pass in a number of clients to read instead, but I prefer doing it this way because I can also assign client1 or client2 in any number of different ways if I want.

CodePudding user response:

A simple for might work depending on how many clients do you want:

def input_clients(how_many):
    clients = []
    for _ in range(how_many):
        client = Client.from_input()
        print(client.name, 'Maximum pension contribution you can make this tax year: ', client.get_maximum_contribution())
        print(client.name, 'Maximum pension contribution your employer can make this year: ', client.get_carryforward()   client.get_remaining_aa())
        print(client.name, 'Remaining annual allowance: ', client.get_remaining_aa())
        print(client.name, 'Carryforward available: ', client.get_carryforward())
        clients.append(client)
    return clients

input_clients(2)
  • Related