QuestionDESCRIPTION:Implement classes Address, Customer, Account, CheckingAccount,and SavingsAccount. Your program must be properly formatted (use pylint) and pass all the tests provided (use pytest).Bank ClassesGeneral requirements for all classesImplement __init__, __repr__, __str__, and __eq__ methods.Implement access to data members using properties with names of the properties being equal to the data member names without the leading underscore (e.g. property foo is used to access data member _foo).Class-specific requirementsClass Address has data members _street, _city, _state, and _zip. Two addresses are equal if all 4 data members are equal. Property street must be mutable (implement setter).Class Customer has data members _name, _dob, and _address. address is an object of type Address. Two customers are equal if all 3 data members are equal. Customers can change address by invoking method move with a new address as an argument.Abstract class Account has data members _owner and _balance. _owner is an object of type Customer. _balance has initial value of 0 and can be changed by invoking methods deposit (add money) or close (set balance to 0).Class CheckingAccount inherits from class Account, has a data member _insufficient_funds_fee, and method process_check. Two checking accounts are equal if they have the same owner and balance. If the account balance is sufficient too clear the check, the check’s amount is subtracted from the balance, else _insufficient_balance_fee is subtracted from the balance (note that this can make the balance negative).Class SavingsAccount has a member _annual_interest_rate and method yield_interest. Two savings accounts are equal if they have the same owner and balance. Whenever the yield_interest method is called, balance increases.OUTPUT:CustomerJohn Doe (2021-03-11)700 College DrDecorah, IA 52101Customer movedJohn Doe (2021-03-11)100 Water StDecorah, IA 52101Address changedJohn Doe (2021-03-11)100 Short StDecorah, IA 52101bank.pyfrom abc import ABC, abstractmethodfrom decimal import Decimalclass Address: “””Class Address””” def __init__(self, street: str, city: str, state: str, zip_code: str) -> None: “””Initializer””” # TODO: Implement this method … # TODO: Implement data members as properties … def __repr__(self) -> str: “””Address representation””” # TODO: Implement this method … def __str__(self) -> str: “””Address as a string””” # TODO: Implement this method … def __eq__(self, other: object) -> bool: “””Address comparison””” # TODO: Implement this method …class Customer: “””Class Customer””” def __init__(self, name_init: str, dob_init: str, address_init: Address) -> None: “””Initializer””” # TODO: Implement this method … # TODO: Implement data members as properties … def __repr__(self) -> str: “””Customer representation””” # TODO: Implement this method … def __str__(self) -> str: “””Customer as a string””” # TODO: Implement this method … def __eq__(self, other: object) -> bool: “””Customer comparison””” # TODO: Implement this method … def move(self, new_address: Address) -> None: “””Change address””” # TODO: Implement this method …class Account(ABC): “””Class Account””” @abstractmethod def __init__(self, owner: Customer, balance: Decimal = Decimal(0)): “””Initializer””” # TODO: Implement this method … # TODO: Implement data members as properties … def __repr__(self) -> str: “””Account representation””” # TODO: Implement this method … def __str__(self) -> str: “””Account as a string””” # TODO: Implement this method … def __eq__(self, other: object) -> bool: “””Accounts comparison””” # TODO: Implement this method … def deposit(self, amount: Decimal) -> None: “””Add money””” # TODO: Implement this method … def close(self) -> None: “””Close account””” # TODO: Implement this method …class CheckingAccount(Account): “””Class CheckingAccount””” def __init__(self, owner: Customer, fee: Decimal, balance: Decimal = Decimal(0)): “””Initializer””” # TODO: Implement this method … # TODO: Implement data members as properties … def __repr__(self) -> str: “””Checking account representation””” # TODO: Implement this method … def __str__(self): “””Checking account as a string””” # TODO: Implement this method … def __eq__(self, other: object) -> bool: “””Checking accounts comparison””” # TODO: Implement this method … def process_check(self, amount: Decimal) -> None: “””Processing a check””” # TODO: Implement this method …class SavingsAccount(Account): “””Class SavingsAccount””” def __init__( self, owner: Customer, interest_rate: Decimal, balance: Decimal = Decimal(0) ): “””Initializer””” # TODO: Implement this method … # TODO: Implement data members as properties … def yield_interest(self) -> None: “””Yield annual interest””” # TODO: Implement this method … def __repr__(self) -> str: “””Savings account representation””” # TODO: Implement this method … def __str__(self): “””Savings account as a string””” # TODO: Implement this method … def __eq__(self, other: object) -> bool: “””Savings accounts comparison””” # TODO: Implement this method …def main(): “””Entry point””” addr1 = Address(“700 College Dr”, “Decorah”, “IA”, “52101”) addr2 = Address(“100 Water St”, “Decorah”, “IA”, “52101”) print(“Customer”) cust = Customer(“John Doe”, “2021-03-11”, addr1) print(cust) print(“Customer moved”) cust.move(addr2) print(cust) print(“Address changed”) addr2._street = “100 Short St” print(cust)if __name__ == “__main__”: main()Computer ScienceEngineering & TechnologyPython Programming COMPUTER S 130

Order your essay today and save 20% with the discount code ESSAYHELP