Disons que nous voulons fournir une abstraction d'un "compte" dans une banque. Voici une approche, en utilisant un function
objet en 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
Voici une autre approche utilisant l'abstraction de type (c'est-à-dire un class
mot - clé en 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
Mon professeur a commencé le sujet "Programmation orientée objet" en introduisant le class
mot - clé et en nous montrant ces puces:
Programmation orientée objet
Une méthode pour organiser des programmes modulaires:
- Barrières d'abstraction
- Passage de message
- Regrouper les informations et les comportements associés
Pensez-vous que la première approche suffirait pour satisfaire la définition ci-dessus? Si oui, pourquoi avons-nous besoin du class
mot - clé pour faire de la programmation orientée objet?
design
object-oriented
python
object-oriented-design
object
suréchange
la source
la source
class
fait une optimisation similaire).foo.bar()
est généralement identique àfoo['bar']()
, et en de rares occasions, cette dernière syntaxe est en fait utile.object['method'](args)
, les objets Python font en fait l'équivalent deobject['method'](object, args)
. Cela devient pertinent lorsqu'une classe de base appelle des méthodes dans une classe enfant, par exemple dans le modèle de stratégie.Réponses:
Toutes nos félicitations! Vous avez redécouvert le fait bien connu que l'orientation d'objet peut se faire sans prise en charge spécifique du langage de programmation. C'est fondamentalement de la même manière que les objets sont introduits dans Scheme dans ce manuel classique . Notez que Scheme n'a pas de
class
mot - clé ou une sorte d'équivalent, et les objets peuvent être créés sans avoir même des classes.Cependant, le paradigme orienté objet a connu un tel succès que de nombreux langages - et Python ne fait pas exception - lui fournissent un support intégré. Il s'agit simplement de faciliter l'utilisation du paradigme par les développeurs et de fournir une forme standard d'orientation d'objet pour ce langage. C'est essentiellement la même raison pour laquelle de nombreux langages fournissent une
for
boucle, bien qu'elle puisse être émulée en utilisant unewhile
boucle avec seulement une ou deux lignes de code supplémentaires - simplement une facilité d'utilisation .la source
Je conviens que la première définition satisfait les trois points soulevés par votre professeur. Je ne pense pas que nous ayons besoin du mot-clé class pour quoi que ce soit. Sous les couvertures, qu'est-ce qu'un objet, sinon une structure de données avec différents types de données et fonctions pour travailler avec les données? Bien sûr, les fonctions sont également des données.
J'irais même plus loin et dirais que faire de la programmation orientée objet ne dépend pas tellement des mots - clés fournis par votre langage, vous pouvez faire de la programmation orientée objet en C si vous le souhaitez! En fait, le noyau Linux utilise de telles techniques.
Ce que vous pouvez déduire du mot-clé class ici, c'est que le langage prend en charge ce type de construction hors de la boîte, et vous n'avez pas besoin de parcourir tous les cerceaux pour réimplémenter la fonctionnalité vous-même (ce qui est une tâche assez amusante dans lui-même!). Sans parler de tout le sucre syntaxique que vous pourriez également obtenir.
la source
Bien sûr vous pouvez!
Le langage d'auto-programmation est un langage orienté objet basé sur un prototype dynamique dans lequel tout est un objet et il n'y a aucun sens des classes ou quoi que ce soit. Il est axé sur l'idée des objets prototypiques et l'idée de les cloner au lieu d'avoir des classes comme modèles de création d'objets.
Vous devriez consulter http://www.selflanguage.org/ pour plus d'informations. Je pense que c'est très intéressant et si vous aimez la POO, c'est une bonne idée de vérifier quelque chose qui n'est pas si courant.
la source
Pas toujours: cela dépend de la langue. Vous avez démontré la capacité de le faire en Python mais (si votre question est destinée à être indépendante du langage malgré la balise Python), toutes les langues ne peuvent pas le faire. Java, par exemple, ne le peut généralement pas. En ignorant la classe qui contient main, il n'y a aucun moyen de définir des méthodes / champs arbitraires sur un objet défini dans main sans le mot-clé class. Bien que les classes anonymes existent, elles nécessitent une interface et elles ne peuvent avoir aucun membre public à l'exception de ceux définis dans l'interface. Bien qu'il soit possible de définir des interfaces personnalisées puis de leur créer des classes anonymes, c'est effectivement la même chose (mais moins pratique) que de simplement utiliser une classe.
Doc Brown a une excellente réponse mais le point que j'essaie de faire est que je suis sûr qu'il y a au moins une langue qui ne permettra pas du tout votre solution.
la source
class
mot - clé, ce n'est donc pas vraiment une surprise. Mais vous pouvez absolument implémenter votre propre système d'objets par-dessus le système d'objets de Java, bien que je ne sache pas pourquoi vous voulez faire une telle chose.class
mot - clé uniquement parce que le langage vous oblige à mettre vos fonctions en classes. Bien sûr, cela est extrêmement théorique, mais même en Java, vous pouvez faire l'Orientation Objet sans les classes intégrées!La définition de votre professeur manque complètement le point le plus important de la programmation orientée objet, la seule chose qui la rend utile et unique. "Message passant" est un tas de bêtises imaginé par les gens de Smalltalk, et c'est un échec partout où il a été essayé. La véritable puissance de la POO est quelque chose connue sous le nom de substitution Liskov , et bien que le concept soit assez simple à décrire et à comprendre, l'implémentation sous-jacente est suffisamment complexe pour qu'il soit essentiellement impossible de faire le bien sans le support au niveau du langage.
L'idée de la substitution Liskov est que partout où votre code attend une variable d'un certain type, il devrait pouvoir accepter n'importe quel type dérivé de ce type et fonctionner correctement sans avoir à connaître les détails du type dérivé.
Par exemple, les frameworks GUI utilisent la substitution Liskov partout. Ils ont tendance à avoir une
Control
classe de base qui peut représenter "n'importe quel contrôle", qui définit une interface qui connaît les actions de base telles que le dessin, le redimensionnement et la réponse aux entrées de l'utilisateur. Si vous cliquez sur un contrôle, le framework d'interface utilisateur appellera uneClick
méthode sur le contrôle sans avoir à se soucier de quel type de contrôle il s'agit, puis laissera le contrôle gérer le clic de la manière appropriée pour sa propre classe. UnButton
contrôle doit faire quelque chose de complètement différent lorsqu'il est cliqué sur unTextBox
contrôle, pour ne donner qu'un exemple.Donc oui, vous pouvez créer quelque chose de similaire aux objets en utilisant l'astuce des fonctions imbriquées décrite ci-dessus, mais comme vous ne pouvez pas obtenir l'héritage et la substitution Liskov de cette façon, c'est un substitut extrêmement limité pour la vraie POO.
la source
child*
à une fonction qui prend unparent*
comme argument, du moins pas sans transtypage.) Et pire encore, les structures C ne peuvent pas avoir de méthodes liées, et il n'y a pas de support pour les méthodes virtuelles , qui sont ce qui fait que la magie de la substitution Liskov fonctionne, vous devez donc construire des VMT à la main, ce qui est un processus compliqué facile à visser.Réponse courte rapide
Oui, les programmeurs peuvent appliquer la programmation orientée objet sans "classes".
Réponse descriptive longue et ennuyeuse
Il existe plusieurs variantes de "l'Object Orientation", mais le premier concept qui vient à l'esprit de nombreux programmeurs est "Classes".
Oui, les programmeurs peuvent appliquer la programmation orientée objet sans "classes", mais sont limités aux fonctionnalités et limitations de chaque langage de programmation.
Votre message est étiqueté comme Python , par conséquent, le titre de votre question peut être plus comme "Comment implémenter la programmation orientée objet sans classes en Python".
J'utilise actuellement l'expression "Object and Class Oriented Programming", pour identifier à partir d'autres variantes comme "Prototyping" de Javascript, ou Visual Basic "Based", ou émulation en "Pure C" en utilisant "functors".
la source