OOP: Object-Oriented Programming

Re-doing an earlier example (see Example 2 in this post), the OOP way.

Input

import csv

# object oriented
class Cash:
    '''description'''
    def __init__(self, name, salary): 
        self.name=name
        self.salary=salary
        self.n500=salary//500
        self.n100=salary%500//100
        self.n50=salary%500%100//50
        self.n10=salary%500%100%50//10
        self.n5=salary%500%100%50%10//5
        self.n1=salary%500%100%50%10%5//1

    def isheoverpaid(self):
        if self.salary>1000:
            print('this person is over paid')
        else:
            print('no')

    def report(self):
        print('\nEmployee name: {}'.format(self.name))
        print('Employee salary: {}'.format(self.salary))
        print('Salary breakdown:')
        print('{} x500'.format(self.n500))
        print('{} x100'.format(self.n100))
        print('{} x50'.format(self.n50))
        print('{} x10'.format(self.n10))
        print('{} x5'.format(self.n5))
        print('{} x1'.format(self.n1))
        print('Is [s]he over paid?')
        self.isheoverpaid()


def printall():
        for j in range(len(emp)):
            emp[j].report()

# input
with open('salaries.csv') as csvfile:
    v=csv.reader(csvfile)
    names=[]
    salaries=[]
    for x in v:
        name=x[0]
        salary=x[1]
        names.append(name)
        salaries.append(salary)

# processing
salaries=[int(k) for k in salaries]

total_names=len(names)
total_salaries=sum(salaries)

# Cash class
emp=[]
for j in range(len(names)):
    emp.append(Cash(names[j],salaries[j]))

total_n500=sum([emp[j].n500 for j in range(len(emp))])
total_n100=sum([emp[j].n100 for j in range(len(emp))])
total_n50=sum([emp[j].n50 for j in range(len(emp))])
total_n10=sum([emp[j].n10 for j in range(len(emp))])
total_n5=sum([emp[j].n5 for j in range(len(emp))])
total_n1=sum([emp[j].n1 for j in range(len(emp))])

# output
print('\nTotal employees: {}'.format(total_names))
print('Total salaries: {}'.format(total_salaries))
print('\nYou need to get:')
print('{} x500'.format(total_n500))
print('{} x100'.format(total_n100))
print('{} x50'.format(total_n50))
print('{} x10'.format(total_n10))
print('{} x5'.format(total_n5))
print('{} x1'.format(total_n1))

Output

Python 3.6.4 (default, Jan  7 2018, 03:53:53) 
[GCC 4.2.1 Compatible Android Clang 5.0.300080 ] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from change3 import*

Total employees: 3
Total salaries: 6906

You need to get:
13 x500
2 x100
3 x50
4 x10
2 x5
6 x1
>>> dir()
['Cash', '__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'csv', 'csvfile', 'emp', 'j', 'name', 'names', 'printall', 'salaries', 'salary', 'total_n1', 'total_n10', 'total_n100', 'total_n5', 'total_n50', 'total_n500', 'total_names', 'total_salaries', 'v', 'x']
>>> emp
[<change3.Cash object at 0xa9506b50>, <change3.Cash object at 0xa9506b90>, <change3.Cash object at 0xa9506bf0>]
>>> emp[0]
<change3.Cash object at 0xa9506b50>
>>> dir(emp)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
>>> dir(emp[0])
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'isheoverpaid', 'n1', 'n10', 'n100', 'n5', 'n50', 'n500', 'name', 'report', 'salary']
>>> emp[0].report()

Employee name: ahmed
Employee salary: 4067
Salary breakdown:
8 x500
0 x100
1 x50
1 x10
1 x5
2 x1
Is [s]he over paid?
this person is over paid
>>> emp[0].salary
4067
>>> emp[0].name
'ahmed'
>>> printall
<function printall at 0xa9701b28>
>>> printall()

Employee name: ahmed
Employee salary: 4067
Salary breakdown:
8 x500
0 x100
1 x50
1 x10
1 x5
2 x1
Is [s]he over paid?
this person is over paid

Employee name: norah
Employee salary: 2050
Salary breakdown:
4 x500
0 x100
1 x50
0 x10
0 x5
0 x1
Is [s]he over paid?
this person is over paid

Employee name: sinjab
Employee salary: 789
Salary breakdown:
1 x500
2 x100
1 x50
3 x10
1 x5
4 x1
Is [s]he over paid?
no
>>>