2014-12-01 18 views
8

Sappiamo che con la notazione:istruzioni condizionali in una classe, ma al di fuori del campo di applicazione della funzione

class Foo(object): 

    a = 1 

    def __init__(self): 
     self.b = 2 

    def c(self): 
     print('c') 

possiamo creare variabile statica Foo.a, 'normale' variabile b, che sarà disponibile dopo la creazione e l'istanza di Foo, e il metodo c

Oggi sono stato davvero sorpreso, che posso utilizzare istruzioni condizionali in una classe, ma al di fuori del campo di applicazione della funzione

class C(): 
    if True: 
     a = 1 
    b = 2 

linguaggi come C++/Java, mi hanno insegnato che la notazione legale è simile a:

class Name(): 
    variable = <expression> 

Potresti descrivere altre regole, che fanno riferimento a questo specifico campo di applicazione? Come dovrei nominare questo ambito?

risposta

11

Il codice categoria è solo codice Python. Ha regole specifiche per l'ambito, ma qualsiasi cosa va diversamente. Questo significa che è possibile creare funzioni condizionale:

class C: 
    if some_condition: 
     def optional_method(self): 
      pass 

o tirare metodi da altrove:

import some_module 

class D: 
    method_name = some_module.function_that_accepts_self 

ecc

documentazione

Il Python per class definitions stati:

una definizione di classe è una dichiarazione eseguibile.

e

La suite classe viene quindi eseguito in una nuova cornice di esecuzione (vedi sezione Naming and binding), utilizzando uno spazio dei nomi locali di nuova creazione e lo spazio dei nomi globale originale. (Di solito, la suite contiene solo le definizioni di funzione.) Quando la suite della classe termina l'esecuzione, la sua cornice di esecuzione viene scartata ma il suo spazio dei nomi locale viene salvato. Viene quindi creato un oggetto classe utilizzando l'elenco di ereditarietà per le classi di base e lo spazio dei nomi locale salvato per il dizionario degli attributi.

Si noti in genere in questo testo. In sostanza, il corpo della classe viene eseguito come una funzione e tutto ciò che viene inserito nello spazio dei nomi del corpo diventa un attributo della classe.

La sezione *Naming and binding allora si dice:

L'ambito di nomi definiti in un blocco di classe è limitata al blocco di classe; non si estende ai blocchi di codice dei metodi

in modo che i nomi definiti in questo blocco non siano accessibili direttamente nei metodi; dovresti usare class.name o self.name.

1

In java tutto è classes e object, classes sono container ma in python tutto è object. Classes sono anche objects. come functions(also objects) quindi quando si usa l'istruzione condizionale nella funzione allora python ti permette di fare lo stesso in Classi.

come: -

def A(): 
    if condition: 
     do something 
    elif condition: 
     do somethig 
    else: 
     do something 

è lo stesso

Class A() 
    if condition: 
     do something 
    elif condition: 
     do somethig 
    else: 
     do something 

è possibile assegnare funzioni anche per memorizzare in una variabile come si fa per le classi

def A(): 
    pass 

a = A # is valid 

mentre in Java è possibile definire la funzione al di fuori delle classi.