2012-02-12 12 views
7

Dove si trova il codice sorgente per il metodo classificatore decoratore situato nel codice sorgente Python. In particolare sto avendo problemi a trovare il file esatto è definito nella versione 2.7.2Posizione di @classmethod

risposta

11

io non rispondo quello che hai chiesto - ma sotto mostra quello che potrebbe essere un decoratore equivalente a classmethod, scritto in Python Pure - dal momento che la uno nel codice sorgente è in C, all'interno di Python-2.7.2/Objects/funcobject.c mentre Mishna inserisce la sua risposta.

Quindi, l'idea dei metodi di classe è di usare il meccanismo "descrittore", come descritto in Python's data model - e fare in modo che il metodo __get__ restituisca un oggetto funzione che, quando chiamato, chiamerà il metodo originale con il primo argomento preriempita:

class myclassmethod(object): 
    def __init__(self, method): 
     self.method = method 
    def __get__(self, instance, cls): 
     return lambda *args, **kw: self.method(cls, *args, **kw) 

E su Python console:

>>> class MyClass(object): 
...  @myclassmethod 
...  def method(cls): 
...   print cls 
... 
>>> 
>>> m = MyClass() 
>>> m.method() 
<class '__main__.MyClass'> 
>>> 

* EDIT - Aggiornamento *

O.P. ha inoltre chiesto "Se volessi che il decoratore accettasse anche un parametro quale sarebbe il formato corretto per init? "-

In questo caso non è solo il __init__ che deve essere modificato - un decoratore che accetta i parametri di configurazione viene effettivamente chiamato in" due fasi "- il primo annota i parametri e restituisce un chiamabile - la seconda chiamata accetta solo la funzione che saranno effettivamente decorato

ci sono alcuni modi per farlo - ma credo che il più semplice è quello di avere una funzione che restituisce la classe di cui sopra, come in:.

def myclasmethod(par1, par2, ...): 
    class _myclassmethod(object): 
     def __init__(self, method): 
      self.method = method 
     def __get__(self, instance, cls): 
      # make use of par1, par2,... variables here at will 
      return lambda *args, **kw: self.method(cls, *args, **kw) 
    return _myclassmethod 
+1

Se volevo che il decoratore accettasse anche un para metro quale sarebbe il formato corretto per init? – user1200501

+0

può essere usato \ _ \ _ call \ _ \ _ al posto di \ _ \ _ get \ _ \ _? – DiogoNeves

+0

ok, dopo aver letto un po 'di descrittori ha senso ora :) – DiogoNeves

9
tar -zxf Python-2.7.2.tgz 
vim Python-2.7.2/Objects/funcobject.c 

... 
589 /* Class method object */ 
590 
591 /* A class method receives the class as implicit first argument, 
592 just like an instance method receives the instance. 
593 To declare a class method, use this idiom: 
594 
595  class C: 
596  def f(cls, arg1, arg2, ...): ... 
597  f = classmethod(f) 
598 
599 It can be called either on the class (e.g. C.f()) or on an instance 
600 (e.g. C().f()); the instance is ignored except for its class. 
601 If a class method is called for a derived class, the derived class 
602 object is passed as the implied first argument. 
603 
604 Class methods are different than C++ or Java static methods. 
605 If you want those, see static methods below. 
606 */ 
... 
+0

Grazie per la giusta posizione della classe – user1200501

Problemi correlati