Je suis en train d'étendre quelques « base » des classes en Python:extension des classes de base en Python
class xlist (list):
def len(self):
return len(self)
def add(self, *args):
self.extend(args)
return None
class xint (int):
def add(self, value):
self += value
return self
x = xlist([1,2,3])
print x.len() ## >>> 3 ok
print x ## >>> [1,2,3] ok
x.add (4, 5, 6)
print x ## >>> [1,2,3,4,5,6] ok
x = xint(10)
print x ## >>> 10 ok
x.add (2)
print x ## >>> 10 # Not ok (#1)
print type(x) ## >>> <class '__main__.xint'> ok
x += 5
print type(x) ## >>> <type 'int'> # Not ok (#2)
Il fonctionne très bien dans la liste cas parce que le append méthode modifie l'objet « en place ", sans le retourner. Mais dans le cas int, la méthode ajouter ne modifie pas la valeur de la variable externe x. Je suppose que c'est bien dans le sens que self est une variable locale dans la méthode add de la classe, mais cela m'empêche de modifier la valeur initiale affectée à l'instance de la classe.
Est-il possible d'étendre une classe de cette façon ou dois-je définir une propriété de classe avec le type de base et mapper toutes les méthodes nécessaires à cette propriété?
Python n'a pas de "types de valeur" et de types de référence. La distinction entre les types mutables et immuables est seulement quelque peu similaire et ne repose pas sur ce genre de distinction. Votre recommandation d'utiliser la composition au lieu de l'héritage est grande, cependant. –