Download presentation
Presentation is loading. Please wait.
1
Computer Science 111 Fundamentals of Programming I
Persistent Data Models Object Serialization
2
Helper Function to Create a Bank
from bank import Bank def createBank(numAccounts = 1): """Returns a new bank with the given number of accounts.""" bank = Bank() upperPin = numAccounts for pinNumber in range(1000, upperPin): bank.add(SavingsAccount('Ken', str(pinNumber))) return bank bank = createBank(5) # Creates 5 accounts in bank
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 save Data model File storage load
4
Saving a Savings Account
Include a method for writing an account’s info to a text file: def save(self, fileObj): # In SavingsAccount fileObj.write(self.name + '\n') fileObj.write(self.pin + '\n') fileObj.write(str(self.balance) + '\n') >>> a = SavingsAccount('Ken', '8809', ) >>> 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 Include a method for writing a bank’s info to a text file: def save(self, fileName): # In Bank fileObj = open(fileName, 'w') for account in self.accounts.values(): account.save(fileObj) fileObj.close() >>> bank = createBank(5) >>> bank.save('bank.txt') Run the method in the shell and then inspect the file:
6
Class Methods vs Instance Methods
Define a class method and an instance method: class MyClass: def instanceMethod(self): return 'I am an instance method.' @classmethod def classMethod(cls): return 'I am a class 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 >>> print(MyClass.classMethod()) I am a class method. >>> print(obj.instanceMethod()) I am an instance method.
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
Include a class method to read an account’s info from a text file and return a new instance with that info: @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)) >>> 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 Include a class method to load accounts and create a 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 >>> 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 pickling Data model File storage 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', ) >>> 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)
Include a method for writing an bank’s info to a text file: def save(self, fileName): # In Bank fileObj = open(fileName, 'w') for account in self.accounts.values(): account.save(fileObj) fileObj.close() Run the method in the shell and then inspect the file: >>> bank = createBank(5) >>> bank.save('bank.txt')
18
Saving an Entire Bank (Pickled)
Include a method for writing an bank’s info to a text file: def save(self, fileName): # In Bank fileObj = open(fileName, 'wb') for account in self.accounts.values(): pickle.dump(account, fileObj) fileObj.close() Run the method in the shell and then inspect the file: >>> bank = createBank(5) >>> bank.save('bank.dat')
19
Loading an Entire Bank (Text)
Include a class method to load accounts and create a 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 >>> bank = Bank.load('bank.txt') >>> print(bank) Test the method in the shell and then inspect the account:
20
Loading an Entire Bank (Pickled)
Include a class method to load accounts and create a bank: @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 Test the method in the shell and then inspect the account: >>> bank = Bank.load('bank.dat') >>> print(bank)
21
For Wednesday Search algorithms
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.