2009-02-05 13 views
31

¿Tiene Python métodos de extensión como C#? ¿Es posible llamar a un método como:Métodos de extensión en Python

MyRandomMethod() 

sobre los tipos existentes como int?

myInt.MyRandomMethod() 
+1

suena como "parche de monos" – hop

Respuesta

39

Usted puede agregar los métodos que desee en los objetos de la clase definidos en el código de Python (parche AKA monkey):

>>> class A(object): 
>>>  pass 


>>> def stuff(self): 
>>>  print self 

>>> A.test = stuff 
>>> A().test() 

Esto no funciona en tipos integrados, porque su __dict__ no se puede escribir (es dictproxy).

Así que no, no hay un mecanismo de método de extensión "real" en Python.

+3

¡Cuanto más tiempo uso Python, mejor se pone! –

7

no está seguro de si eso lo que preguntas, pero se puede ampliar los tipos existentes y luego llamar a lo que quiera en la nueva cosa:

class int(int): 
    def random_method(self): 
      return 4      # guaranteed to be random 
v = int(5)        # you'll have to instantiate all you variables like this 
v.random_method() 

class int(int): 
    def xkcd(self): 
     import antigravity 
     print(42) 

>>>v.xkcd() 
Traceback (most recent call last): 
    File "<pyshell#81>", line 1, in <module> 
    v.xkcd() 
AttributeError: 'int' object has no attribute 'xkcd' 
c = int(1) 
>>> c.random_method() 
4 
>>> c.xkcd() 
42 

esperanza de que aclara su pregunta

+0

Pero me refiero a llamar directamente a los tipos existentes, no a MyInt, sino a int. Entonces, como v = 5; v.RandomMethod(); –

+0

puede llamar a la clase int (int), pero necesitará crear una instancia de la variable como: v = int (5) – SilentGhost

+3

Niza referencia XKCD. –

0

Otra opción es anular la metaclase. Esto le permite, entre otras cosas, especificar funciones que deberían existir en todas las clases.

En este artículo se empieza a hablar de ello:

http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html

+0

¿Funciona esto para tipos integrados como int? –

+1

No creo que las metaclases te den ninguna forma de modificar los tipos incorporados. –

+0

Eso es correcto, solo puede modificar el comportamiento de las clases. – tsellon

Cuestiones relacionadas