¿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()
¿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()
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.
¡Cuanto más tiempo uso Python, mejor se pone! –
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
Pero me refiero a llamar directamente a los tipos existentes, no a MyInt, sino a int. Entonces, como v = 5; v.RandomMethod(); –
puede llamar a la clase int (int), pero necesitará crear una instancia de la variable como: v = int (5) – SilentGhost
Niza referencia XKCD. –
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
¿Funciona esto para tipos integrados como int? –
No creo que las metaclases te den ninguna forma de modificar los tipos incorporados. –
Eso es correcto, solo puede modificar el comportamiento de las clases. – tsellon
que he tenido mucha suerte con el método descrito aquí:
http://mail.python.org/pipermail/python-dev/2008-January/076194.html
tengo ni idea de si funciona en builtins aunque.
Desafortunadamente, ninguno de los métodos funciona en complementos. – ESV
suena como "parche de monos" – hop