Binnen het ISBN-10 (International Standard Book Numbering) systeem dat tot eind 2006 gebruikt werd, kreeg elk boek een unieke code toegewezen die bestaat uit 10 cijfers. De eerste 9 daarvan geven informatie over het boek zelf, terwijl het laatste louter een controlecijfer is dat dient om foutieve ISBN-10 codes te detecteren.
Als $$x_1, \ldots, x_9$$ de eerste 9 cijfers van een ISBN-10 code voorstellen, dan wordt het controlecijfer $$x_{10}$$ als volgt berekend: \[x_{10} = (x_1+ 2x_2+ 3x_3+ 4x_4+ 5x_5+ 6x_6+ 7x_7+ 8x_8+ 9x_9)\!\!\!\!\mod{11}\,\] Het controlecijfer $$x_{10}$$ kan m.a.w. de waarden 0 tot en met 10 aannemen. Als het controlecijfer gelijk is aan 10, dan wordt dit in de ISBN-10 code genoteerd als de letter X. Op die manier wordt het controlecijfer altijd door één enkel karakter voorgesteld.
Binnen het nieuwe ISBN-13 systeem krijgt elk boek een unieke code toegewezen die bestaat uit 13 cijfers. De eerste 12 daarvan geven informatie over het boek zelf, terwijl het laatste louter een controlecijfer is dat dient om foutieve ISBN-13 codes te detecteren. Als $$x_1, \ldots, x_{12}$$ de eerste 12 cijfers van een ISBN-13 code voorstellen, dan wordt het controlecijfer $$x_{13}$$ als volgt berekend: \[\begin{align} o &= x_1 + x_3 + x_5 + x_7 + x_9 + x_{11} \\ e &= x_2 + x_4 + x_6 + x_8 + x_{10} + x_{12} \\ x_{13} &= (10 - (o + 3e)\!\!\!\!\mod{10})\!\!\!\!\!\mod{10}\end{align}\] Het controlecijfer $$x_{13}$$ kan m.a.w. de waarden 0 tot en met 9 aannemen, waardoor ISBN-13 codes uitsluitend uit cijfers bestaan.
Een ISBN-13 code heeft een vaste structuur die heel wat informatie bevat. De eerste 3 cijfers zijn ofwel 978 ofwel 979. De codes die beginnen met 978 zijn boeken waarvoor er ook een ISBN-10 code is. Na de eerste 3 cijfers volgt er eerst een aanduiding van de landengroep waar dit boek is gepubliceerd. Deze aanduiding kan 1 tot en met 5 karakters bevatten. Daarna volgt een identificatie van de uitgever en het item. Het laatste karakter is, zoals reeds beschreven werd, een controlecijfer.
De ISBN-10 code van een boek met een ISBN-13 code kan eenvoudig berekend worden. Deze berekening is wel enkel geldig voor ISBN-13 codes die beginnen met de prefix 978:
verwijder de cijfers 978 vooraan de code
verwijder het controlecijfer achteraan de code
bereken het nieuwe controlecijfer volgens de regels van ISBN-10
Definieer een klasse ISBN13 waarmee ISBN-13 codes kunnen voorgesteld worden. Deze klasse moet minstens de volgende methoden ondersteunen:
Een initialisatiemethode __init__ waaraan een getal (int) moet doorgegeven worden dat een ISBN-13 code voorstelt. De initialisatiemethode moet niet expliciet controleren dat het argument een geldige ISBN-13 code voorstelt. De initialisatiemethode heeft ook nog een tweede optionele parameter waaraan de lengte (int) van de landaanduiding kan doorgegeven worden (standaardwaarde: 1). Als de opgegeven lengte niet in het interval [1, 5] ligt, dan moet een AssertionError opgeworpen worden met de boodschap ongeldige ISBN code.
Een methode __str__ die een stringvoorstelling (str) van de ISBN-13 code teruggeeft. Hierbij worden er koppeltekens tussen de verschillende groepen geplaatst: de prefix 978 of 979, de landaanduiding, de identificatie van uitgever en item en het controlecijfer.
Een methode __repr__ die een stringvoorstelling (str) van het object teruggeeft, die leest als een Python expressie om een nieuw object aan te maken met dezelfde toestand als het huidige object.
Een methode isgeldig die een Booleaanse waarde (bool) teruggeeft die aangeeft of het object een geldige ISBN-13 code voorstelt.
Een methode alsISBN10 die een string (str) teruggeeft die het object als ISBN-10 code voorstelt. Als zo'n voorstelling niet bestaat (omdat het object geen geldige ISBN-13 code is of omdat de ISBN-13 code niet begint met de prefix 978), dan moet de waarde None teruggegeven worden.
>>> code = ISBN13(9780136110675)
>>> print(code)
978-0-13611067-5
>>> code
ISBN13(9780136110675, 1)
>>> code.isgeldig()
True
>>> code.alsISBN10()
'0-13611067-3'
In onderstaande video legt Pythia uit hoe je deze opgave kunt aanpakken. Bekijk deze video als opstapje naar het oplossen van de oefeningen over objectgericht programmeren1.