2016-06-02 13 views
8

Ich komme jetzt aus Java und lerne Python. Ich versuche das Konzept der Klassenmitglieder in Python zu verstehen. HierKlassenmitglieder - Java vs. Python

ist ein Beispielprogramm 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); 
} } 

Das ist, was ich in Python hat, folgende einige Beispiele, die ich gefunden:

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

    def ex(self): 
     self.x = 7 

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

Beide Programme zurück:

0 
7 

Hier sind meine Fragen:

  1. Ist der Python-Code korrekt?
  2. Der Programmierstil von Python scheint mir im Vergleich zu Java kompakter zu sein. So frage ich mich, WARUM Python erfordert die Weitergabe eines "Selbst" -Parameters.
  3. An diesem Punkt scheint Python "komplexer" zu sein als Java. Oder gibt es eine Möglichkeit, den "Selbst" -Parameter zu entfernen?
+4

(1) Ja. (2) Google deine Frage genau so. (3) Vielleicht, aber wenn es ist, ist es obskur und du solltest es nicht tun. –

+0

AFAIK der Python-Code ist korrekt. Und ich denke, dass das "Selbst" eher wegen Pythons Philosophie als wegen technischer Notwendigkeit benötigt wird. Blick auf Pythons Fehlen von Klammern zum Abgrenzen von Codeblöcken und stattdessen striktes Festhalten an Einrückung, was, wie ich glaube, ich vor einiger Zeit gelesen habe, aufgrund der Philosophie, dass die Programme mit richtigem Einrücken lesbarer werden. In diesem Fall müssen Sie explizit angeben, dass Sie die Instanzvariable und nicht eine lokale Variable meinen, um die Eindeutigkeit zu gewährleisten. (Ich verwende aus diesem Grund sogar explizites "this" in Java ...) – Julian

+1

"self" ist in Python verfügbar, weil "Explicit ist besser als implizit" (https://www.python.org/dev/peps/pep- 0020 /). Ich würde eher fragen: "Warum hat Java eine magische, nicht deklarierte Variable, die" dieses "heißt? (wahrscheinlich weil C++ hat). – cdarke

Antwort

7

Zuerst ist Ihr Python-Code korrekt.

Es kommt nur darauf an, wie die Sprachen gestaltet sind. Java verwendet eine Art automatische Inferenz eines Verweises auf das Objekt. Es kann für Nicht-Java-Experten manchmal zu seltsamen Verhalten führen:

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

Also, es ist, warum in Java gibt es das Schlüsselwort this die verwendet werden können (aber Sie sind nicht gezwungen), um diese Zweideutigkeit zu lösen.

Das Python-Team entschied sich, das Wort self (oder irgendein anderes Wort, aber ich werde es später erklären) zu verwenden, um diese Art von Problem zu vermeiden. Du kannst es nicht loswerden. Allerdings ist Java immer noch eine ausführlichere Sprache als Python und das Schlüsselwort self beeinflusst diese Annahme nicht sehr.

Sie sind jedoch nicht verpflichtet, das Wort "self" als Verweis auf das aktuelle Objekt zu verwenden. Sie können jedes andere Wort verwenden, das der erste Parameter Ihrer Methode wäre (aber es ist eine sehr schlechte Übung).

Hier können Sie zwei Referenzen sehen, die tief erklären, warum "Selbst hier bleiben":

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

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

+0

'self' ist meines Wissens nur eine Konvention. Sie können 'this' stattdessen verwenden: http://ideone.com/B5Kn0j – zapl

+1

@zapl er adressierte dieses im letzten Absatz – gt6989b

+0

@zapl Sie konnten es" Banane "nennen, aber tun Sie nicht; Namenskonventionen reduzieren die verschwendete Zeit. – jonrsharpe

0

So in Java ist die Struktur im Allgemeinen

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

es ist sehr ähnlich in Python. gleiche Struktur nur für alle Funktionen, die mit den Daten arbeiten, die Sie selbst als Argument verwenden müssen. wo Java, musste es keine Argumente nehmen.

Es scheint auch in Python alle Daten sind standardmäßig öffentlich, so dass Sie nicht Getter und Setter wie in Java verwenden müssen.

persönlich finde ich eine Python-Klasse eher ein C-Struct mit einigen zusätzlichen Features, wobei Java alles in eine Klasse geworfen wird.

-2

2.) Python ist eine Hochsprache. wo Java ist mehr Mid-High im Raten. irgendwie neu in Java.

Python geht durch Leerraum, wo Java mehr Formatierung erfordert.

3.) der Selbstparameter kann entfernt werden. Ersetzen Sie mit was auch immer Sie es nennen möchten.

+3

* "Ich rate" * - bitte nicht. – jonrsharpe

Verwandte Themen