¿Es posible agregar un método a una clase de objeto y usarlo en todos los objetos?

4
appqui-platform 26 abr. 2009 a las 13:36

3 respuestas

La mejor respuesta

En Python los atributos se implementan utilizando un diccionario:

>>> t = test()
>>> t.__dict__["foo"] = "bla"
>>> t.foo
'bla'

Pero para "objeto", utiliza un 'dictproxy' como interfaz para evitar dicha asignación:

>>> object.__dict__["test"] = "test"
TypeError: 'dictproxy' object does not support item assignment

Entonces no, no puedes.

NB: tampoco puede modificar el tipo de metaclase directamente. Pero como Python es muy flexible, estoy seguro de que un Gurú podría encontrar la manera de lograr lo que quieres. ¿Algún mago negro por aquí :-)?

8
e-satis 26 abr. 2009 a las 10:12
>>> object.test = "Test"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: can't set attributes of built-in/extension type 'object'

No lo parece. (Python 2.5.1)

0
Georg Schölly 26 abr. 2009 a las 09:48

No, las partes internas de Python tienen mucho cuidado de hacer que los tipos incorporados NO sean mutables, opciones de diseño muy diferentes a las de Ruby. No es posible hacer que el objeto sea "monopatizable" sin meterse profundamente con los componentes internos codificados en C y recompilar el tiempo de ejecución de Python para hacer una versión muy diferente (esto es para el clásico CPython, pero creo que exactamente el mismo principio se aplica a otras implementaciones buenas como como Jython e IronPython, solo s / C / Java / y S / C / C # / respectivamente ;-).

5
Alex Martelli 26 abr. 2009 a las 16:07