J'ai quelques classes Python qui, si on les simplifie, ressemblent à ceci :
class base:
def __init__(self, v):
self.value = v
def doThings(self):
print "Doing things."
def doMoreThings(self):
print "Doing more things."
def combine(self, b):
self.value += b.value
class foo(base):
def showValue(self):
print "foo value is %d." % self.value
class bar(base):
def showValue(self):
print "bar value is %d." % self.value
En base
contient des méthodes (représentées ci-dessus par doThings
y doMoreThings
) qui mettent en œuvre des fonctionnalités communes à la fois à l foo
y bar
sous-classes. Le site foo
y bar
Les sous-classes diffèrent essentiellement dans la manière dont elles interprètent l'élément value
champ. (Au-dessus, ils ne diffèrent que par ce qu'ils montrent lors de l'impression, mais dans mon application réelle, ils font plusieurs autres choses qui sont plus compliquées). base
peuvent être considérés comme "abstraits" : les utilisateurs ne travaillent jamais qu'avec les foo
et bar
s. base
n'existe que pour abriter le code commun à ses sous-classes.
La méthode sur laquelle je veux poser une question est combine
qui vous permet de prendre deux de ces objets et d'en créer un troisième. Parce que foo
y bar
interpréter value
différemment, cela n'a pas de sens de combine
deux sous-classes de types différents : vous pouvez combine
deux foo
pour obtenir un foo
ou deux bar
pour obtenir un bar
mais pas un foo
et un bar
. Malgré cela, la procédure de combine
est le même pour toutes les sous-classes, il est donc logique qu'elle soit prise en compte et définie à un seul endroit.
J'aimerais probablement signaler une erreur si un utilisateur tente de combine
deux objets incompatibles, mais je ne vois pas comment le faire sans introduire de vilains contrôles de type. Est-ce une bonne pratique de faire cela ? Ou dois-je faire comme d'habitude et ne pas vérifier, documenter le problème, et supposer que l'utilisateur n'essaiera pas d'utiliser combine
d'une manière qui n'était pas prévue, même si cette utilisation semble " réussir " et renvoie un objet poubelle au lieu de soulever une erreur ?
Merci pour votre aide.