2016-06-02 13 views
8

Vengo da Java e sto imparando Python, ora. Cerco di capire il concetto dei membri della classe in Python.Membri di classe - Java vs Python

Ecco un esempio di programma in Java:

class Hello { 
    int x = 0; 

    void ex() { 
     x = 7; 
    } 

    public static void main(String args[]) { 
     Hello h = new Hello(); 
     System.out.println(h.x); 
     h.ex(); 
     System.out.println(h.x); 
} } 

che è quello che ho fatto in Python, a seguito di alcuni esempi che ho trovato:

class Hello: 
    def __init__(self) : 
     self.x = 0 

    def ex(self): 
     self.x = 7 

h = Hello() 
print(h.x) 
h.ex() 
print(h.x) 

Entrambi i programmi di ritorno:

0 
7 

Ecco le mie domande:

  1. Il codice Python è corretto?
  2. Lo stile di programmazione di Python mi sembra più compatto rispetto a Java. Quindi mi chiedo, PERCHÉ Python richiede il superamento di un "sé" - Parametro.
  3. A questo punto Python sembra essere più "complesso" di Java. O c'è un modo per rimuovere il "sé" - Parametro?
+4

(1) Sì. (2) Google la tua domanda esattamente così. (3) Forse, ma se c'è, è oscuro e non dovresti farlo. –

+0

AFAIK il codice Python è corretto. E penso che il "sé" sia più necessario a causa della filosofia di Python piuttosto che della necessità tecnica. Guardando verso la mancanza di parentesi di Python per delimitare i blocchi di codice e invece attenersi rigorosamente all'indentazione, che è, come penso di aver letto qualche tempo fa, a causa della filosofia che i programmi diventano più leggibili con indentazione corretta. In questo caso: richiedendo di indicare esplicitamente che si intende la variabile di istanza e non una variabile locale per mantenere le cose inequivocabili. (Io uso anche esplicitamente "this" in Java per questo motivo ...) – Julian

+1

'self' è esposto in Python perché" Explicit è meglio di implicito "(https://www.python.org/dev/peps/pep- 0020 /). Preferirei chiedere "perché Java ha una variabile magica non dichiarata chiamata 'questo'"? (probabilmente perché C++ ha). – cdarke

risposta

7

In primo luogo, il codice Python è corretto.

È solo una questione di come sono state progettate le lingue. Java utilizza una sorta di inferenza automatica di un riferimento all'oggetto. Si può portare a volte a comportamenti strani per gli esperti non-Java:

private int a; 
public int add(int a, int b){ 
    return a+b; // what a will it use? 
} 

Quindi, è il motivo per cui in Java c'è la parola this che può essere usato (ma non sei obbligato) al fine di risolvere questa ambiguità.

Il team python ha deciso di forzare l'uso della parola self (o qualsiasi altra parola, ma spiegherò in seguito) per evitare questo tipo di problema. Non puoi liberartene. Tuttavia, java è ancora un linguaggio più prolisso di Python e la parola chiave self non influisce molto sull'ipotesi.

Tuttavia non si è obbligati a utilizzare la parola "self" come riferimento all'oggetto corrente. Puoi usare qualsiasi altra parola che sarebbe il primo parametro del tuo metodo (ma è una pratica molto negativa).

Qui, si può vedere due riferimenti che spiegano a fondo per questo "sé è qui per restare":

http://www.programiz.com/article/python-self-why

http://neopythonic.blogspot.be/2008/10/why-explicit-self-has-to-stay.html

+0

'self' è a mia conoscenza solo una convenzione. Potresti usare 'this' invece: http://ideone.com/B5Kn0j – zapl

+1

@zapl ha trattato questo nell'ultimo paragrafo – gt6989b

+0

@zapl potresti chiamarlo' banana', ma non farlo; le convenzioni di denominazione riducono il tempo sprecato. – jonrsharpe

0

Così in Java la struttura è generalmente

Class 
     private data (aka the "struct") 
     public data 
     constructors (__init__ in python) 
     functions etc 

è molto simile in python. stessa struttura solo per tutte le funzioni che lavorano con i dati di cui hai bisogno per mettere te stesso come argomento. dove java non doveva prendere argomenti.

Anche in Python tutti i dati sono pubblici per impostazione predefinita, quindi non è necessario utilizzare getter e setter come in Java.

personalmente trovo una classe Python più di un C-Struct con alcune funzionalità aggiunte, in cui java è tutto gettato in una classe.

-2

2.) Python è un linguaggio di alto livello. dove java è più alto di metà altezza. un po 'di nuovo a Java.

python passa allo spazio bianco, dove java richiede più formattazione.

3.) il parametro automatico può essere rimosso. sostituire con qualsiasi cosa si voglia chiamare.

+3

* "im guessing" * - per favore non farlo. – jonrsharpe