¿Cómo puedo extender una clase incorporada en python? Me gustaría agregar un método a la clase str.
He hecho algunas búsquedas pero todo lo que estoy buscando son publicaciones antiguas, espero que alguien sepa algo más nuevo.Extendiendo clases incorporadas en python
Respuesta
Sólo subclase del tipo
>>> class X(str):
... def myMethod(self):
... return int(self)
...
>>> s=X("Hi Mom")
>>> s.lower()
'hi mom'
>>> s.myMethod()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in myMethod
ValueError: invalid literal for int() with base 10: 'Hi Mom'
>>> z=X("271828")
>>> z.lower()
'271828'
>>> z.myMethod()
271828
Tenía la esperanza de no tener que subclase, pero después de un poco más de investigación he llegado a la conclusión de que no es posible de otra manera, por lo que voy a aceptar esta respuesta. – UnkwnTech
@Unkwntech: No se puede imaginar una mejor manera que la subclasificación. Seriamente. Cualquier cosa que tengas en mente (¿monopatch?) Nunca parece funcionar tan bien como una subclase clara, precisa y obvia. –
@ S.Lott - Las clases abiertas de Ruby y los métodos de extensión de C# vienen a la mente. – orip
una posible alternativa sería utilizar el concepto "reapertura de clase" (de forma nativa existente en Ruby) que puede ser implementado en Python usando un decorador clase. Un exemple se da en esta página: http://www.ianbicking.org/blog/2007/08/opening-python-classes.html
cito:
Creo que con decoradores de clase que podría hacer esto:
@extend(SomeClassThatAlreadyExists)
class SomeClassThatAlreadyExists:
def some_method(self, blahblahblah):
stuff
implementa de la siguiente:
def extend(class_to_extend):
def decorator(extending_class):
class_to_extend.__dict__.update(extending_class.__dict__)
return class_to_extend
return decorator
Suponiendo que no puede cambiar las clases integradas. para simular una "clase reapertura" como Ruby en python3 donde __dict__
es un objeto mappingproxy y el objeto no dict:
def open(cls):
def update(extension):
for k,v in extension.__dict__.items():
if k != '__dict__':
setattr(cls,k,v)
return cls
return update
class A(object):
def hello(self):
print('Hello!')
A().hello() #=> Hello!
#reopen class A
@open(A)
class A(object):
def hello(self):
print('New hello!')
def bye(self):
print('Bye bye')
A().hello() #=> New hello!
A().bye() #=> Bye bye
yo también podría escribir una función decoradora 'abierta', así:
def open(cls):
def update(extension):
namespace = dict(cls.__dict__)
namespace.update(dict(extension.__dict__))
return type(cls.__name__,cls.__bases__,namespace)
return update
- 1. Extendiendo clases estáticas PHP
- 2. Extendiendo clases e instancias
- 3. ¿Es correcto heredar de las clases incorporadas?
- 4. Extendiendo clases integradas de SWIG
- 5. Extendiendo Python con C/C++
- 6. Extendiendo una lista de listas en Python?
- 7. Python: Señal de teclado/interrupciones incorporadas
- 8. ¿Dónde puedo encontrar los métodos y atributos de las clases incorporadas de python?
- 9. Tipos y clases en Python
- 10. Extendiendo el String incorporado de Python
- 11. ¿Cómo obtener un buen diagrama de clases para clases incorporadas de .net?
- 12. Extendiendo las clases de vista genéricas para get_context_data común
- 13. ¿Encontrar el código fuente para las funciones incorporadas de Python?
- 14. Clases estáticas en Python
- 15. Extendiendo singletons en PHP
- 16. Extendiendo System.Convert
- 17. Extendiendo ImageMagickNet
- 18. Python: por qué el atributo __dict__ no está en las instancias de clase incorporadas
- 19. Codeigniter extendiendo extendido MY_Controller
- 20. clases de decorador en Python
- 21. Registro entre clases en python
- 22. Clases de parches en Python
- 23. decoradores de Python en clases
- 24. Clases de "amigo" en python
- 25. Lista de fuentes WPF incorporadas
- 26. Funciones incorporadas para ordenar matrices en C
- 27. luabind: no se pueden recuperar los valores de la tabla indexada por clases no incorporadas
- 28. Python ... clases de prueba?
- 29. asp.net extendiendo IPrincipal
- 30. Extendiendo EF4 SQL Generation
posible duplicado de [¿Puedes aplicar los métodos de parche en los tipos de núcleo en python?] (http://stackoverflow.com/questions/192649/can-you-monkey-patch-methods-on-core-types-in-python) – jfs
Ver también –
sanxiyn