2014-07-11 29 views
5

E 'un po' difficile da capire questo comportamento:In python, la funzione è un oggetto?

def a(): 
    pass 


type(a) 
>> function 

Se type di a è function, qual è type di function?

type(function) 
>> NameError: name 'function' is not defined 

E perché fa type di type da a è type?

type(type(a)) 
>> type 

ultimo: se a è un object, perché non posso farlo:

isinstance(a, object) 
>> True 


class x(a): 
    pass 
TypeError: Error when calling the metaclass bases 
    function() argument 1 must be code, not str 

Grazie!

+0

Tutti sembrano corretti. Cosa ti aspetti che 'type (function)' torni? – CoryKramer

+4

possibile duplicato di [Quali sono gli oggetti di "prima classe"?] (Http://stackoverflow.com/questions/245192/what-are-first-class-objects) –

+0

possibile duplicato di [Cos'è un metaclasse in Python?] (http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python) – davidism

risposta

5

Il tipo di qualsiasi funzione è <type 'function'>. Il tipo del tipo di funzione è <type 'type'>, come hai ottenuto con type(type(a)). Il motivo type(function) non funziona perché type(function) sta cercando di ottenere il tipo di una variabile non dichiarata denominata function, non il tipo di una funzione effettiva (ad esempio, function non è una parola chiave).

Si sta verificando l'errore metaclass durante la definizione della classe perché a è di tipo function e si can't subclass functions in Python.

Un sacco di buone informazioni in the docs.

3

Il tipo di function è type, che è la metaclasse di base in Python. Una metaclasse è la classe di una classe. Puoi usare type anche come funzione per dirti il ​​tipo di oggetto, ma questo è un artefatto storico.

Il modulo types fornisce riferimenti diretti ai tipi più incorporati.

>>> import types 
>>> def a(): 
... pass 
>>> isinstance(a, types.FunctionType) 
True 
>>> type(a) is types.FunctionType 

In linea di principio, si può anche creare un'istanza della classe types.FunctionType direttamente e creare una funzione in modo dinamico, anche se non riesco a immaginare una situazione reale in cui è ragionevole per farlo:

>>> import types 
>>> a = types.FunctionType(compile('print "Hello World!"', '', 'exec'), {}, 'a') 
>>> a 
<function a at 0x01FCD630> 
>>> a() 
Hello World! 
>>> 

Si puo' t sottoclasse una funzione, ecco perché il tuo ultimo snippet fallisce, ma non puoi sottoclasse lo types.FunctionType.

Problemi correlati