Supponiamo di voler fornire un'astrazione di un "conto" in una banca. Ecco un approccio, usando un function
oggetto in Python:
def account():
"""Return a dispatch dictionary representing a bank account.
>>> a = account()
>>> a['deposit'](100)
100
>>> a['withdraw'](90)
10
>>> a['withdraw'](90)
'Insufficient funds'
>>> a['balance']
10
"""
def withdraw(amount):
if amount > dispatch['balance']:
return 'Insufficient funds'
dispatch['balance'] -= amount
return dispatch['balance']
def deposit(amount):
dispatch['balance'] += amount
return dispatch['balance']
dispatch = {'balance': 0,
'withdraw': withdraw,
'deposit': deposit}
return dispatch
Ecco un altro approccio che utilizza l'astrazione del tipo (ovvero la class
parola chiave in Python):
class Account(object):
"""A bank account has a balance and an account holder.
>>> a = Account('John')
>>> a.deposit(100)
100
>>> a.withdraw(90)
10
>>> a.withdraw(90)
'Insufficient funds'
>>> a.balance
10
"""
def __init__(self, account_holder):
self.balance = 0
self.holder = account_holder
def deposit(self, amount):
"""Add amount to balance."""
self.balance = self.balance + amount
return self.balance
def withdraw(self, amount):
"""Subtract amount from balance if funds are available."""
if amount > self.balance:
return 'Insufficient funds'
self.balance = self.balance - amount
return self.balance
Il mio insegnante ha iniziato l'argomento "Programmazione orientata agli oggetti" introducendo la class
parola chiave e mostrandoci questi punti elenco:
Programmazione orientata agli oggetti
Un metodo per organizzare programmi modulari:
- Barriere di astrazione
- Messaggio che passa
- Raggruppamento di informazioni e comportamenti correlati
Pensi che il primo approccio sarebbe sufficiente per soddisfare la definizione di cui sopra? Se sì, perché abbiamo bisogno della class
parola chiave per eseguire una programmazione orientata agli oggetti?
foo.bar()
di solito è identico a foo['bar']()
, e in rare occasioni quest'ultima sintassi è effettivamente utile.
object['method'](args)
, gli oggetti Python fanno effettivamente l'equivalente di object['method'](object, args)
. Ciò diventa rilevante quando una classe base chiama metodi in una classe figlio, ad esempio nel modello di strategia.
class
esegua un'ottimizzazione simile).