2012-08-01 25 views
8

Esta es una pregunta académica, más que práctica. Estoy tratando de profundizar en los fundamentos de Python, y me pregunto: ¿podría implementar los decoradores staticmethod y classmethod en Python puro si quisiera?¿Se pueden implementar los métodos estáticos y los decodificadores de clase en Python puro?

¿Podría mantener una referencia a la función original y llamarla omitiendo el primer argumento?

Para classmethod quizás podría mantener una referencia a la función original y llamarla pasando el tipo del primer argumento, en lugar del argumento en sí mismo? (¿Cómo manejaría que se llamara directamente a la clase?)

Una vez más, no es que realmente quiera implementarlo en mis programas; Quiero aprender cómo funciona el lenguaje a partir de él. Si es posible, agradecería muestras de código. Si no, agradecería explicaciones por qué no se puede hacer teóricamente. ¡Gracias!

Edit: ¡Gracias por la respuesta y por la referencia al protocolo del descriptor! Como un medio para ampliar aún más mi comprensión de Python que me gustaría hacer dos cosas más:

  • Podría hacerse esto sin el protocolo de descriptor, por ejemplo mediante la aplicación de la llamada __ __ método especial en nuestras clases?

  • ¿El protocolo de descriptor funciona de la misma manera en Python 2.7 y en Python 3.x?

¡Gracias nuevamente!

Respuesta

10

Hay ejemplos en the docs:

class StaticMethod(object): 
    "Emulate PyStaticMethod_Type() in Objects/funcobject.c" 

    def __init__(self, f): 
     self.f = f 

    def __get__(self, obj, objtype=None): 
     return self.f 

Y:

class ClassMethod(object): 
    "Emulate PyClassMethod_Type() in Objects/funcobject.c" 

    def __init__(self, f): 
     self.f = f 

    def __get__(self, obj, klass=None): 
     if klass is None: 
      klass = type(obj) 
     def newfunc(*args): 
      return self.f(klass, *args) 
     return newfunc 
+0

Voy a aceptar esta respuesta, ya que es una respuesta buena y completa a mi pregunta original. ¡Sin embargo, lo agradeceré mucho si responden a mi edición también! ¡Gracias! – Tom

1

Debe aceptar la respuesta de JF Sebastián, ya que responde a su pregunta directamente, pero esta pregunta significa que usted quiere saber acerca de el protocolo de descripción que puede leer sobre here, que es lo que se usa para implementar estos y otros aspectos internos importantes de Python (y puede ser útil en su propio código cuando se usa con moderación). property, y los antiguos métodos enlazados son otras cosas que se escriben usando el protocolo descriptor.

Deberías echarle un vistazo, no es tan simple cuando lo lees por primera vez, pero hará clic.

+0

¡Gracias por el enlace y la explicación! Por favor mira mi edición. – Tom

Cuestiones relacionadas