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
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
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 */
...
Grazie per la giusta posizione della classe – user1200501
- 1. Come funziona un oggetto classmethod?
- 2. Perché usare classmethod invece di staticmethod?
- 3. È possibile ereditare un python @classmethod?
- 4. Python 2.7 Combina abc.abstractmethod e classmethod
- 5. Verificare se una funzione utilizza @classmethod
- 6. Cosa significa classmethod fare in questo codice?
- 7. classmethod in stile Python per C#?
- 8. Chiamata classmethod di una classe base in Python
- 9. Utilizzando stessa funzione di istanza e classmethod in pitone
- 10. A cosa si riferisce "sé" in un @classmethod?
- 11. classmethod proprietà TypeError: 'proprietà' oggetto non è iterabile
- 12. pitone: ibrido tra il metodo regolare e classmethod
- 13. Python - come posso ottenere il nome di classe all'interno di un metodo di classe - utilizzando @classmethod
- 14. Misterioso test "classMethod` nel test di Gradle Scala con JUnit 4
- 15. Il mio indicatore di posizione del pulsante di posizione
- 16. Posizione di inserimento JavaScript
- 17. Imposta posizione di scorrimento
- 18. CSS3 Posizione di animazione
- 19. Start strategia di posizione
- 20. cambia posizione di UIImageView
- 21. Posizione di rightView UITextField
- 22. CSS: posizione: fissa all'interno della posizione: assoluta
- 23. Differenza tra posizione: appiccicosa e posizione: fissa?
- 24. Come applicare patch classmethod con autospec in una classe non bloccata?
- 25. I decoratori staticmethod e classmethod possono essere implementati in puro Python?
- 26. Mantenere posizione Drag & Dropped posizione al riavvio
- 27. Parzialmente Valutare Python classmethod In base a dove è accessibile da
- 28. Ottenere la posizione di JPopupMenu
- 29. Modifica posizione barra di scorrimento
- 30. Posizione di sfondo appena verticale
Se volevo che il decoratore accettasse anche un para metro quale sarebbe il formato corretto per init? – user1200501
può essere usato \ _ \ _ call \ _ \ _ al posto di \ _ \ _ get \ _ \ _? – DiogoNeves
ok, dopo aver letto un po 'di descrittori ha senso ora :) – DiogoNeves