Download presentation
Presentation is loading. Please wait.
Published byErica Cooper Modified over 9 years ago
1
Computer Science 111 Fundamentals of Programming I Persistent Data Models Object Serialization
2
from bank import Bank def createBank(numAccounts = 1): """Returns a new bank with the given number of accounts.""" bank = Bank() upperPin = numAccounts + 1000 for pinNumber in range(1000, upperPin): bank.add(SavingsAccount('Ken', str(pinNumber))) return bank Helper Function to Create a Bank bank = createBank(5)
3
Transience and Persistence Data in computer memory are transient and are lost when the program quits Data become persistent when they can be saved to a file and reloaded from a file File storage Data model save load
4
Saving a Savings Account def save(self, fileObj): # In SavingsAccount fileObj.write(self.name + '\n') fileObj.write(self.pin + '\n') fileObj.write(str(self.balance) + '\n') Include a method for writing an account ’ s info to a text file: >>> a = SavingsAccount('Ken', '8809', 500.00) >>> fileObj = open('account.txt', 'w') >>> a.save(fileObj) >>> fileObj.close() Run the method in the shell and then inspect the file:
5
Saving an Entire Bank def save(self, fileName): # In Bank fileObj = open(fileName, 'w') for account in self.accounts.values(): account.save(fileObj) fileObj.close() Include a method for writing an bank ’ s info to a text file: >>> bank = createBank(5) >>> bank.save('bank.txt') Run the method in the shell and then inspect the file:
6
Class Methods vs Instance Methods class MyClass: def instanceMethod(self): return 'I am an instance method.' @classmethod def classMethod(cls): return 'I am a class method.' Define a class method and an instance method: >>> print(MyClass.classMethod()) I am a class method. >>> obj = MyClass() >>> print(obj.instanceMethod()) I am an instance method. Try both methods in the shell:
7
Class Methods vs Instance Methods Like a class variable, a class method is used with the class ’ s name An instance method is always used with an instance Class methods can see class variables but not instance variables Instance methods can see both kinds of variables
8
Why Use Class Methods? Class methods are often used to create and return instances of those classes Such methods are also called factory methods >>> class MyClass: @classmethod def getInstance(cls): return MyClass() >>> obj = MyClass.getInstance() Example:
9
Loading a Savings Account @classmethod def load(cls, fileObj): # In SavingsAccount name = fileObj.readline().strip() pin = fileObj.readline().strip() balance = fileObj.readline().strip() if not name: return None else: return SavingsAccount(name, pin, float(balance)) Include a class method to read an account ’ s info from a text file and return a new instance with that info: >>> fileObj = open('account.txt', 'r') >>> a = SavingsAccount.load(fileObj) >>> print(a) Run the method in the shell and then inspect the account:
10
Loading an Entire Bank @classmethod def load(cls, fileName): # In Bank fileObj = open(fileName, 'r') bank = Bank() while True: a = SavingsAccount.load(fileObj) if not a: break else: bank.addAccount(a) fileObj.close() return bank Include a class method to load accounts and create a bank: >>> bank = Bank.load('bank.txt') >>> print(bank) Test the method in the shell and then inspect the account:
11
Problems Lots of manual labor to output and input the attributes of accounts as text Must change this code every time we modify the structure of an account (add an address attribute, etc.) A text file is insecure and inefficient
12
Solution: Pickle the Data Pickling automates the process of converting an object to a form suitable for file storage Unpickling automates the process of converting data from file storage back to the appropriate objects File storage Data model pickling unpickling
13
The pickle Module dump(obj, fileObj) # Pickles obj and writes it to fileObj load(fileObj) # Reads an object from fileObj, # unpickles it, and returns it # Raises an exception if the end of # the file is reached
14
Using pickle for Output >>> import pickle >>> fileObj = open('test.dat', 'wb') >>> pickle.dump('Hi there!', fileObj) >>> fileobj.close() Must use the argument “wb” or “rb” when opening a file for output or input The “b” stands for “byte”
15
Using pickle for Input >>> import pickle >>> fileObj = open('test.dat', 'wb') >>> pickle.dump('Hi there!', fileObj) >>> fileobj.close() >>> fileObj = open('test.dat', 'rb') >>> s = pickle.load(fileObj) >>> print(s) Hi there!
16
Using pickle with Accounts >>> import pickle >>> fileObj = open('test.dat', 'wb') >>> account = SavingsAccount('Ken', '8809', 500.00) >>> pickle.dump(account, fileObj) >>> fileobj.close() >>> fileObj = open('test.dat', 'rb') >>> account = pickle.load(fileObj) >>> print(account) Blah blah blah
17
Saving an Entire Bank (Text) def save(self, fileName): # In Bank fileObj = open(fileName, 'w') for account in self.accounts.values(): account.save(fileObj) fileObj.close() Include a method for writing an bank ’ s info to a text file: >>> bank = createBank(5) >>> bank.save('bank.txt') Run the method in the shell and then inspect the file:
18
Saving an Entire Bank (Pickled) def save(self, fileName): # In Bank fileObj = open(fileName, 'wb') for account in self.accounts.values(): pickle.dump(account, fileObj) fileObj.close() Include a method for writing an bank ’ s info to a text file: >>> bank = createBank(5) >>> bank.save('bank.dat') Run the method in the shell and then inspect the file:
19
Loading an Entire Bank (Text) @classmethod def load(cls, fileName): # In Bank fileObj = open(fileName, 'r') bank = Bank() while True: a = SavingsAccount.load(fileObj)) if not a: break else: bank.addAccount(a) fileObj.close() return bank Include a class method to load accounts and create a bank: >>> bank = Bank.load('bank.txt') >>> print(bank) Test the method in the shell and then inspect the account:
20
Loading an Entire Bank (Pickled) @classmethod def load(cls, fileName): # In Bank fileObj = open(fileName, 'rb') bank = Bank() try: while True: a = pickle.load(fileObj) bank.addAccount(a) except Exception(e): fileObj.close() return bank Include a class method to load accounts and create a bank: >>> bank = Bank.load('bank.dat') >>> print(bank) Test the method in the shell and then inspect the account:
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.