Estimados pitón 3 expertos método,python2 vs función python3 a la unión
con python2, se podría hacer lo siguiente (ya sé que es un poco difícil, pero ese no es el punto aquí: p):
class A(object):
def method(self, other):
print self, other
class B(object): pass
B.method = types.MethodType(A().method, None, B)
B.method() # print both A and B instances
con python3, no hay más métodos independientes, solo funciones. Si quiero el mismo comportamiento, parece que tengo que introducir un descriptor de costumbre, tales como:
class UnboundMethod:
"""unbound method wrapper necessary for python3 where we can't turn
arbitrary object into a method (no more unbound method and only function
are turned automatically to method when accessed through an instance)
"""
def __init__(self, callable):
self.callable = callable
def __get__(self, instance, objtype):
if instance is None:
return self.callable
return types.MethodType(self.callable, instance)
por lo que puedo hacer:
B.method = UnboundMethodType(A().method)
B.method() # print both A and B instances
¿Hay alguna otra manera de hacerlo sin escribir tal descriptor?
TIA
Comentario rápido, fuera del tema: No es necesario derivar del objeto en Py3. Siempre se hace implícitamente. Para verificar, simplemente 'print (anyobject .__ mro __) '(= orden de resolución de método) – cfi
Creo que esta es una duplicación de [http://stackoverflow.com/questions/10729909/convert-builtin-function-type-to-method -type-in-python-3]. Sin embargo, esta pregunta es probablemente más fácil de encontrar. También está más claro (al menos para mí), así que votaría para mantener este ... – cfi
@cfi, cierto sobre la herencia de objetos, muestra del código UnboundMethod fijo. También tienes razón en que es una pregunta similar a la de encuadernar una función compilada/incorporada (que no tiene una respuesta satisfactoria por cierto) – sthenault