estoy tratando de extender algunas clases de "base" en Python:Ampliación de clases 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)
Funciona bien en el caso lista porque el anexar método modifica el objeto "en su sitio ", sin devolverlo. Pero en el caso int, el método agregar no modifica el valor de la variable externa x. Supongo que está bien en el sentido de que auto es una variable local en el añadir método de la clase, pero esto me está impidiendo la modificación del valor inicial asignado a la instancia de la clase.
¿Es posible extender una clase de esta manera o debería definir una propiedad de clase con el tipo de base y mapear todos los métodos necesarios para esta propiedad?
Python no tiene "tipos de valores" ni tipos de referencia. La distinción entre tipos mutables e inmutables es solo algo similar y no se basa en ese tipo de distinción. Sin embargo, su recomendación de usar composición en lugar de herencia es excelente. –