{
 "metadata": {
  "name": "",
  "signature": "sha256:dbbd8ed92141bcc804ff2fbeacf8bb85f122dc6e196e1d830291a4a449a3a439"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "heading",
     "level": 1,
     "metadata": {},
     "source": [
      "Chapter 8: Data Abstraction through Classes and User-Defined Data Types "
     ]
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Program Source Code 8.1, page no: 208"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "class Super:\n",
      " def __init__(self):\n",
      "        self.__IntegerData=None  #private member\n",
      "         #public functions\n",
      " def SetData(self,i):\n",
      "        self.__IntegerData=i      #refer to IntegerData\n",
      " def ShowData(self):\n",
      "        print \"Data is \",self.__IntegerData,' '\n",
      "\n",
      "ob1=Super()\n",
      "ob2=Super()\n",
      "ob1.SetData(1000)\n",
      "ob2.SetData(2000)\n",
      "ob1.ShowData()\n",
      "ob2.ShowData()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Data is  1000  \n",
        "Data is  2000  \n"
       ]
      }
     ],
     "prompt_number": 1
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Program Source Code 8.2, page no:211"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "class X:\n",
      "    def __init__(self):\n",
      "        self.a=None   #private members\n",
      "        self.b=None      #private members\n",
      "    \n",
      "#no structure type present in python    \n",
      "x = X()\n",
      "\n",
      "x.a=0\n",
      "x.b=1\n",
      "print \"x.a=\",x.a,\",x.b=\",x.b"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "x.a= 0 ,x.b= 1\n"
       ]
      }
     ],
     "prompt_number": 1
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Program Source Code 8.3, page no:214"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "class Fraction:\n",
      "  \n",
      "    def SetValue(self,a,b):    #public functions\n",
      "        self.__num=a             \n",
      "        self.__denom=b          \n",
      "    def GetValue(self,a,b):\n",
      "        a=self.__num\n",
      "        b=self.__denom\n",
      "    \n",
      "f=Fraction()\n",
      "n=input(\"Enter n: \") #user input\n",
      "d=input(\"Enter d: \")    #user input\n",
      "print \"enter the numerator and denominator: \", '  ',n,d\n",
      "\n",
      "f.SetValue(n,d) #call function SetValue\n",
      "print \"Numerator value set: \", ' ',n\n",
      "print \"Denominator value set: \", ' ',d\n",
      "f.GetValue(n,d)     #call function GetData\n",
      "print \"Numerator value retrieved: \", ' ',n\n",
      "print \"Denominator value retrieved: \", ' ',d"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter n: 3\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter d: 4\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "enter the numerator and denominator:     3 4\n",
        "Numerator value set:    3\n",
        "Denominator value set:    4\n",
        "Numerator value retrieved:    3\n",
        "Denominator value retrieved:    4\n"
       ]
      }
     ],
     "prompt_number": 3
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Program Source Code 8.4, page no:216"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "class SimpleClass:\n",
      "    def __init__(self):\n",
      "       self.__i=None  #private member\n",
      "    \n",
      "    def __init__(self):\n",
      "        self.__i=500             #constructor\n",
      "        \n",
      "    def SetData(self,d):\n",
      "        self.__i=d\n",
      "        \n",
      "    def GetData(self):\n",
      "        return self.__i\n",
      "     \n",
      "#Initializing\n",
      "s1=SimpleClass()\n",
      "s2=SimpleClass()\n",
      "print \"s1 has data: \",s1.GetData()\n",
      "print \"s2 has data: \",s2.GetData()\n",
      "s1.SetData(1000)         #function call\n",
      "s2.SetData(2000)\n",
      "print \"s1 has data: \",s1.GetData(),' '\n",
      "print \"s2 has data: \", s2.GetData(),' '\n"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "s1 has data:  500\n",
        "s2 has data:  500\n",
        "s1 has data:  1000  \n",
        "s2 has data:  2000  \n"
       ]
      }
     ],
     "prompt_number": 1
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Program Source Code 8.5, page no:217"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "class SimpleClass:\n",
      "    __IntegerData=None\n",
      "    def __init__(self,data=None):\n",
      "       if data==None:\n",
      "        self.__IntegerData=500   #default constructor\n",
      "       else:\n",
      "        self.__IntegerData=data    #parameterised constructor\n",
      "        \n",
      "    def SetData(self,d):\n",
      "        self.__IntegerData=d\n",
      "        \n",
      "    def GetData(self):\n",
      "        return self.__IntegerData\n",
      "     \n",
      "#Initializing\n",
      "s1=SimpleClass()\n",
      "s2=SimpleClass()\n",
      "s3=SimpleClass(400)\n",
      "s4=SimpleClass(600)\n",
      "print \"s1 has data: \",s1.GetData(),' '\n",
      "print \"s2 has data: \",s2.GetData(),' '\n",
      "print \"s3 has data: \",s3.GetData(),' '\n",
      "print \"s4 has data: \",s4.GetData(),' '\n"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "s1 has data:  500  \n",
        "s2 has data:  500  \n",
        "s3 has data:  400  \n",
        "s4 has data:  600  \n"
       ]
      }
     ],
     "prompt_number": 1
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Program Source Code 8.6, page no:218"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "class Fraction: \n",
      "    def_init_num=None   #private members\n",
      "    def_init_denom=None   #private members\n",
      "    def __init__(self,a=0,b=1):\n",
      "            self.__num=a\n",
      "            self.__denom=b\n",
      "            print \"Numerator set inside constructor\",' ',n\n",
      "            print \"Denominator set inside constructor\",' ',d\n",
      "        \n",
      "    def SetValue(self,a,b):\n",
      "       self.__num=a\n",
      "       self.__denom=b\n",
      "    def GetValue(self,a,b):\n",
      "        a= self.__num\n",
      "        b= self.__denom\n",
      "        return a,b\n",
      "    \n",
      "    def __del__(self):       #destructor\n",
      "        pass\n",
      "    \n",
      "n=input(\"Enter n: \") #user input\n",
      "d=input(\"Enter d: \")    #user input\n",
      "print \"Please enter value of numerator and denominator: \",' ',n,d\n",
      "f=Fraction(n,d)\n",
      "f.GetValue(n,d)\n",
      "print \"Numerator value retrieved: \", ' ',n\n",
      "print \"Denominator value retrieved: \", ' ',d"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter n: 3\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter d: 4\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Please enter value of numerator and denominator:    3 4\n",
        "Numerator set inside constructor   3\n",
        "Denominator set inside constructor   4\n",
        "Numerator value retrieved:    3\n",
        "Denominator value retrieved:    4\n"
       ]
      }
     ],
     "prompt_number": 1
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Program Source Code 8.7, page no:221"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "class Fraction:\n",
      "            \n",
      "    def __init__(self,a=0,b=1):    #constructor\n",
      "            self.__num=a\n",
      "            self.__denom=b\n",
      "            print \"Numerator set inside constructor: \",self.__num\n",
      "            print \"Denominator set inside constructor:  \",self.__denom \n",
      "        \n",
      "    def GetValue(self,a,b):\n",
      "        return self.__num,self.__denom\n",
      "n=input(\"Enter n: \") #user input\n",
      "d=input(\"Enter d: \")    #user input\n",
      "print \"Please enter the value of the numerator and denominator: \",n,d\n",
      "f=Fraction(n,d)\n",
      "n,d=f.GetValue(n,d)\n",
      "print \"Numerator value retrieved: \", ' ',n\n",
      "print \"Denominator value retrieved: \", ' ',d\n",
      "n=input(\"Please enter the value of numerator only: \")\n",
      "f1=Fraction(n)\n",
      "n,d=f1.GetValue(n,d)\n",
      "print \"Numerator value retrieved: \", ' ',n\n",
      "print \"Denominator value retrieved: \", ' ',d\n",
      "print 'ok..now I will create a fraction-no input please'\n",
      "f2=Fraction()\n",
      "n,d=f2.GetValue(n,d)\n",
      "print \"Numerator value retrieved: \", ' ',n\n",
      "print \"Denominator value retrieved: \", ' ',d"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter n: 3\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter d: 4\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Please enter the value of the numerator and denominator:  3 4\n",
        "Numerator set inside constructor:  3\n",
        "Denominator set inside constructor:   4\n",
        "Numerator value retrieved:    3\n",
        "Denominator value retrieved:    4\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Please enter the value of numerator only: 3\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Numerator set inside constructor:  3\n",
        "Denominator set inside constructor:   1\n",
        "Numerator value retrieved:    3\n",
        "Denominator value retrieved:    1\n",
        "ok..now I will create a fraction-no input please\n",
        "Numerator set inside constructor:  0\n",
        "Denominator set inside constructor:   1\n",
        "Numerator value retrieved:    0\n",
        "Denominator value retrieved:    1\n"
       ]
      }
     ],
     "prompt_number": 3
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Program Source Code 8.8, page no:223"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "class Fraction:\n",
      "    def_init_num=None   #private members\n",
      "    def_init_denom=None   #private members\n",
      "    \n",
      "    def __init__(self,anotherFraction=None):         \n",
      "        if anotherFraction==None:               #normal constructor\n",
      "            self.__num=anotherFraction\n",
      "            self.__denom=anotherFraction\n",
      "        else:                          #copy constructor\n",
      "            self.__num=anotherFraction.self.__num\n",
      "            self.__denom=anotherFraction.self.__denom\n",
      "           \n",
      "           \n",
      "    #public functions\n",
      "    def SetValue(self,a,b):\n",
      "        self.__num=a\n",
      "        self.__denom=b#refer to IntegerData\n",
      "    def GetValue(self,a,b):\n",
      "        a=self.__num\n",
      "        b=self.__denom\n",
      "        return a,b\n",
      "    \n",
      "f=Fraction()\n",
      "n=input(\"Enter n: \") #user input\n",
      "d=input(\"Enter d: \")    #user input\n",
      "print \"enter the numerator and denominator: \", '  ',n,d\n",
      "\n",
      "f.SetValue(n,d) #call function SetValue\n",
      "print \"Numerator value set: \", ' ',n\n",
      "print \"Denominator value set: \", ' ',d\n",
      "f.GetValue(n,d)     #call function GetData\n",
      "print \"Numerator value retrieved: \", ' ',n\n",
      "print \"Denominator value retrieved: \", ' ',d\n",
      "print \"Now a second clone copy is being created: \",''\n",
      "f1=f\n",
      "f1.GetValue(n,d)\n",
      "print  \"Clone's numerator value retrieved: \", ' ',n\n",
      "print \"Clone's denominator value retrieved: \", ' ',d"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter n: 5\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Enter d: 6\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "enter the numerator and denominator:     5 6\n",
        "Numerator value set:    5\n",
        "Denominator value set:    6\n",
        "Numerator value retrieved:    5\n",
        "Denominator value retrieved:    6\n",
        "Now a second clone copy is being created:  \n",
        "Clone's numerator value retrieved:    5\n",
        "Clone's denominator value retrieved:    6\n"
       ]
      }
     ],
     "prompt_number": 1
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Program Source Code 8.9, page no:229"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def MyNewHandler():\n",
      "    print \"Sorry operator new failed to allocate memory\"\n",
      "    exit(0)\n",
      "    \n",
      "def _set_new_handler(s):\n",
      "    s()\n",
      "#In python there is no in-built  _set_new_handler function, so i made this function and passed MyNewHandler function as a parameters\n",
      "_set_new_handler(MyNewHandler)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Sorry operator new failed to allocate memory\n"
       ]
      }
     ],
     "prompt_number": 1
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Program Source Code 8.10, page no:230"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from ctypes import * \n",
      "class Fraction: \n",
      "    def __init__(self,a=0,b=1): \n",
      "        if isinstance(a,int): \n",
      "            c = c_int(a) \n",
      "            d = c_int(b) \n",
      "            self.__num = pointer(c) \n",
      "            self.__denom = pointer(d) \n",
      "            print 'constructor sets numerator = ', self.__num[0] , ', denominator = ', self.__denom[0] \n",
      "        else:\n",
      "            c=c_int(a.__num[0])\n",
      "            d = c_int(a.__denom[0])\n",
      "            self.__num = pointer(c) \n",
      "            self.__denom = pointer(d)\n",
      "            print 'copy constructor sets numerator = ', self.__num[0] , ', denominator = ', self.__denom[0] \n",
      "            \n",
      "        def __del__(self): \n",
      "            print 'destructor deallocates numerator = ', self.__num[0] , ', denominator = ', self.__denom[0] \n",
      "    \n",
      "n = input(\"Please enter values of numerator: \") \n",
      "d = input(\"Please enter values of denominator: \") \n",
      "f = Fraction(n,d) \n",
      "print 'Please enter another set of ' \n",
      "n = input(\"numerator: \") \n",
      "d = input(\"denominator: \") \n",
      "print 'Creating fraction *pf : ' \n",
      "pf = Fraction(n,d) \n",
      "print 'Now a clone copy (f2) created from *pf: ' \n",
      "f2 = Fraction(pf)\n",
      "print 'Now another clone copy (*pf2) created from f:' \n",
      "pf2 = Fraction(f) \n",
      "print '*pf2 is being destroyed:' \n",
      "del pf2\n",
      "print '*pf is being destroyed:' \n",
      "del pf \n",
      "print 'now objects f2 and f automatically destroyed : '"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Please enter values of numerator: 3\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Please enter values of denominator: 4\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "constructor sets numerator =  3 , denominator =  4\n",
        "Please enter another set of \n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "numerator: 5\n"
       ]
      },
      {
       "name": "stdout",
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "denominator: 6\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Creating fraction *pf : \n",
        "constructor sets numerator =  5 , denominator =  6\n",
        "Now a clone copy (f2) created from *pf: \n",
        "copy constructor sets numerator =  5 , denominator =  6\n",
        "Now another clone copy (*pf2) created from f:\n",
        "copy constructor sets numerator =  3 , denominator =  4\n",
        "*pf2 is being destroyed:\n",
        "*pf is being destroyed:\n",
        "now objects f2 and f automatically destroyed : \n"
       ]
      }
     ],
     "prompt_number": 1
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Program Source Code 8.11, page no:234"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def Memfail(self,s):\n",
      "    print \"Sorry Unable to allocate memory\"\n",
      "    sys.exit(0)\n",
      "\n",
      "MAX_SIZE = 60 + 1\n",
      "\n",
      "MAX_SIZE=[[0 for col in range(MAX_SIZE)]for row in range(MAX_SIZE)]\n",
      "nChar=0\n",
      "chArr=\"Hello\"\n",
      "\n",
      "print \"Please input a string( 60 characters max.): \",chArr\n",
      "\n",
      "nChar=len(chArr)+1\n",
      "szStr=chArr\n",
      "print \"required memory space for\",nChar,\n",
      "print \"characters\"\n",
      "chArr=szStr           #string copy\n",
      "szStr=chArr\n",
      "print \"String copied in allocated space: \",szStr\n",
      "print \"Memory space dellocated\"\n"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Please input a string( 60 characters max.):  Hello\n",
        "required memory space for 6 characters\n",
        "String copied in allocated space:  Hello\n",
        "Memory space dellocated\n"
       ]
      }
     ],
     "prompt_number": 4
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Program Source Code 8.12, page no:236"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "class Fraction:\n",
      "            \n",
      "    def __init__(self,a=0,b=1): #constructor\n",
      "            self.__num=a\n",
      "            self.__denom=b\n",
      "        \n",
      "    def __del__(self):     #destructor\n",
      "       pass\n",
      "        \n",
      "    def GetValue(self,a,b):\n",
      "        a=self.__num\n",
      "        b=self.__denom\n",
      "        return self.__num,self.__denom\n",
      "n=4\n",
      "d=5\n",
      "f=Fraction(4,5)\n",
      "n,d=f.GetValue(n,d)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 2
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Program Source Code 8.13, page no:239"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "class X:\n",
      "    __sa=20    #initialising static member\n",
      "    a = None\n",
      "    def __init__(self):\n",
      "        self.a=None    #public member\n",
      "    def f(self,b):\n",
      "        a=30\n",
      "        print \"Global a= \",b\n",
      "        print \"Local a= \",a\n",
      "        print \"Nonstatic member a= \",self.a\n",
      "        print \"static member sa= \",self.__sa\n",
      "\n",
      "a=10\n",
      "\n",
      "aXobj=X()\n",
      "aXobj.a=40\n",
      "aXobj.f(a)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Global a=  10\n",
        "Local a=  30\n",
        "Nonstatic member a=  40\n",
        "static member sa=  20\n"
       ]
      }
     ],
     "prompt_number": 1
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [],
     "language": "python",
     "metadata": {},
     "outputs": []
    }
   ],
   "metadata": {}
  }
 ]
}