2012-08-01 8 views
8

Questa è una domanda accademica, più che pratica. Sto cercando di approfondire le basi di Python, e mi chiedo: potrei implementare i decoratori staticmethod e classmethod in Python puro, se volessi?I decoratori staticmethod e classmethod possono essere implementati in puro Python?

Per staticmethod forse potrei mantenere un riferimento alla funzione originale e chiamarlo omettendo il primo argomento?

Per classmethod forse potrei mantenere un riferimento alla funzione originale e chiamarlo passando il tipo del primo argomento, piuttosto che l'argomento stesso? (Come dovrei gestirlo chiamando direttamente sulla classe?)

Ancora, non è che io voglia effettivamente implementarlo nei miei programmi; Voglio imparare come funziona la lingua. Se è possibile farlo, apprezzerei molto i campioni di codice. In caso contrario, apprezzerei le spiegazioni perché non può essere fatto teoricamente. Grazie!

Modifica: Grazie per la risposta e per il riferimento al protocollo descrittore! Come mezzo per estendere ulteriormente la mia comprensione di Python mi piacerebbe fare altre due cose:

  • Questo potrebbe essere fatto senza il protocollo descrittore, ad esempio implementando la chiamata __ __ metodo speciale nelle nostre classi?

  • Il protocollo descrittore funziona allo stesso modo in Python 2.7 e in Python 3.x?

Grazie ancora!

risposta

10

Ci sono esempi in 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 

E:

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

Ho intenzione di accettare questa risposta, in quanto è una buona e completa risposta alla mia domanda iniziale. Tuttavia, lo apprezzerò molto se risponderai anche alla mia modifica! Grazie! – Tom

1

Dovreste accettare la risposta di JF Sebastian, dal momento che risponde direttamente alla tua domanda, ma questa domanda significa che volete sapere su il protocollo descrittore che puoi leggere su here, che è la cosa usata per implementare questi e altri importanti interni di Python (e può essere utile nel tuo codice se usato con parsimonia). property e i normali metodi associati a ol sono altre cose scritte usando il protocollo descrittore.

Dovresti controllare, non è così semplice quando lo leggi per la prima volta, ma farà clic.

+0

Grazie per il link e la spiegazione! Si prega di consultare la mia modifica. – Tom