Was ist fehlgeschlagen, als ich von Javaer zu Pythonista gewechselt bin?

zunaechst

Dies ist der 12/2-Artikel von PyCon JP Adventskalender 2016. Es gibt andere interessante Artikel. Wenn Sie interessiert sind, tun Sie dies bitte. Es gibt Stellen, an denen Java geschrieben ist, aber es kann falsch sein, weil es eine Weile her ist. Ich hoffe, Sie können es lesen, während Sie die Atmosphäre beobachten.

Zweck

Wie das Thema sagt, werde ich die Fehler, die ich gemacht habe, teilen, damit diejenigen, die dies lesen, den Übergang von Javaer zu Pythonista reibungslos gestalten können.

Vorstellen

Ein Mitglied der PyCon JP 2017. Apropos Aktivitäten im Zusammenhang mit PyCon, Talk in 2015 und LT in 2016 / watch? v = O1-9Yv9cB8Q & t = 820s) Das erste Python Boot Camp war auch Dozent. Twitter-Account ist @horobi_gengar

Geschichte bisher

In Bezug auf das Thema halte ich es für notwendig, daher werde ich kurz die Sprache erläutern, die bisher in der Entwicklung verwendet wurde.

Auftrag Anmeldefrist Muttersprache Ergänzung
1. Firma Zweieinhalb Jahre nichts Besonderes c oder vb. Je nach Standort flexibel
2. Firma 5 ½ Jahre Java Außerdem JavaScript, Delphi, COBOL usw.
3. Firma 5 Monate nichts Besonderes C#Und PHP nach und nach
4. Firma 2 Jahre Python Sehr selten in Ruby verwickelt
5. Firma 3 Monate(Laufend) Python Schreiben Sie ab und zu JavaScript

Diese Geschichte handelt also von der 4. Firma.

Was ist fehlgeschlagen

Ich habe in 1 Datei und 1 Klasse geschrieben

Ich habe viele Fehler gemacht, aber dies war der größte. Java wird grundsätzlich in einer Datei und einer Klasse (mit Ausnahmen) beschrieben, Python beschreibt jedoch häufig mehrere Klassen in einer Datei. In Bezug auf das Image muss Python mit einem Image geschrieben werden, das eine Pakethierarchie weniger als Java aufweist.

Ich werde es zusammen mit dem Bild des Pakets (Ordnerstruktur) erklären. Wenn es sich beispielsweise um DAO handelt, um auf die Benutzertabelle im allgemeinen Modul zuzugreifen

common  └db   └dao

Erstellen Sie eine Datei mit dem Namen Users.java unter dem Paket Users und erstellen Sie eine Klasse mit dem Namen Users.

Und wenn Sie diese Users-Klasse aus einer anderen Klasse verwenden möchten,

Users.java


package common.db.dao.Users

users = new Users()
user = users.getUser(1)

Es fühlt sich an wie. Wenn Sie jedoch in Python mit derselben Paketstruktur schreiben,

users.py


from common.db.dao.users import Users 

users = Users()
user = users.get_user(1)

Es wird so und das Ende von von und der Inhalt des Imports werden überlagert, was hilfreich ist. Erstellen Sie in diesem Fall also dao.py unter dem db-Paket, beschreiben Sie die darin enthaltene Users-Klasse und

users.py


from common.db.dao import Users 

users = Users()
user = users.get_user(1)

Es sollte so beschrieben werden. (Dies scheint eine große Sache für die Größe der Dao-Datei zu sein, aber es ist nur ein Beispiel) Aufgrund dieses Fehlers wurde beschlossen, ein Modul mit einer bestimmten Erfolgsbilanz vorsichtig zu modifizieren.

Ich habe alle internen Variablen veröffentlicht.

Wenn Sie im Fall von Java am Anfang der internen Variablen der Klasse public oder private hinzufügen, können Sie explizit angeben, ob von außen auf sie verwiesen werden kann.

User.java



public class User{
    public int userId;          //Zugänglich von außerhalb der Klasse
    private String userName; //Von außerhalb der Klasse nicht zugänglich
    public User(int userId, String userName){
        this.userId = userId
        this.userName = userName
  }
}

User u = new User(1, "Yamada Taro")
System.out.println(u.userId)  //sicher
System.out.println(u.userName)//aus

Andererseits ist es im Fall von Python durch Hinzufügen von "_ (Unterstrich)" zum Variablennamen möglich, öffentlich und privat in Java zu steuern. (Wenn Sie es tun möchten, können Sie darauf verweisen.)

user.py


class User(object):
    def __init__(self, user_id, user_name):
        self.user_id = user_id       #Zugänglich von außerhalb der Klasse
        self.__user_name = user_name #Von außerhalb der Klasse nicht zugänglich

u = User(1, 'Yamada Taro')
print(u.uer_id)     #sicher
print(u.__user_name)#aus

Als ich anfing, Python zu schreiben, habe ich meine Gedanken falsch verstanden und mich an die folgenden Sprachspezifikationen erinnert.

user.py


class User(object):
    user_id = 0                    #Wenn Sie es an dieser Stelle schreiben, können Sie von außerhalb der Klasse darauf zugreifen
    def __init__(self, user_id, user_name):
        self.user_id = user_id       
        self.user_name = user_name #Wenn nicht geschrieben, wird es als privat behandelt

u = User(1, 'Yamada Taro')
print(u.uer_id)   #sicher
print(u.user_name)#aus(ich dachte)

Warum ist das passiert? Natürlich kann von außen so oft auf Benutzername zugegriffen werden, wie Sie möchten. Als ich das bemerkte, lief mir kalte Luft auf den Rücken und es sollte ein Festival mit zwei Unterstangen stattfinden.

Ich habe einen Getter / Setter gemacht.

Geben Sie im Fall von Java keine internen Variablen als öffentlich an, sondern erstellen Sie Getter und Setter unter Berücksichtigung des Einflussbereichs usw.

User.java



public class User{
    private int userId;         //Halten Sie interne Variablen von außen unzugänglich
    private String userName;
    public User(int userId, String userName){
        this.userId = userId
        this.userName = userName
    }
    public int getUserId(){
        return this.userId;
    }
    public int getUserName(){
        return this.userName;
    }
}

User u = new User(1, "Yamada Taro")
System.out.println(u.getUserId())  //Kapselung durch Sandwiching einer Funktion, anstatt eine interne Variable direkt aufzurufen
System.out.println(u.getUserName())

Schließlich hat Eclipse die Funktion, Getter und Setter gleichzeitig zu erstellen. Also habe ich dasselbe mit Python gemacht.

user.py



class User(object):
    def __init__(self, user_id, user_name):
        self.__user_id = user_id
        self.__user_name = user_name

    def get_user_id(self):
        return self.__user_id

    def get_user_name(self):
        return self.__user_name


u = User(1, 'Yamada Taro')
print(u.get_user_id())
print(u.get_user_name())#Verwenden Sie es so

Einer der Vorzüge sogenannter Lightweight-Sprachen wie Python ist "geringe Menge an Code". Diese schlechte Beschreibungsmethode ist ein sehr schlechtes Know-how, das seine Vorzüge vollständig zunichte macht. Es tut uns leid. Im Fall von Python ist dies in Ordnung.

user.py



class User(object):
    def __init__(self, user_id, user_name):
        self.user_id = user_id       #Keine Unterleisten mehr, wenn sie direkt von außen zugänglich sind
        self.user_name = user_name

u = User(1, 'Yamada Taro')
print(u.user_id)
u.user_name = 'Jiro Suzuki' #Sie können so oft darauf zugreifen, wie Sie möchten, aber das ist in Ordnung! !! !!

Wenn Sie sich wirklich dafür interessieren, sollten Sie auch Eigentum verwenden.

user.py



class User(object):
    def __init__(self, user_id, user_name):
        self.__user_id = user_id
        self.__user_name = user_name

    @property                          #Wenn es schreibgeschützt ist, sieht es so aus
    def user_id(self):
        return self.__user_id

    @property
    def user_name(self):
        return self.__user_name


u = User(1, 'Yamada Taro')
print(u.user_id)       #sicher
u.user_name = 'Jiro Suzuki' #aus! !! !! !!

Es ist wichtig, richtig zu schreiben.

Nachwort

Bisher mehrmals "Der Python, den Sie geschrieben haben, ist Java-ähnlich" "Ich bin Javaer, aber der Python, den Sie geschrieben haben, ist leicht zu lesen." Mir wurde gesagt, dass ich sehr besorgt darüber sei, also schrieb ich diesen Artikel. Im Vergleich zu Python, das von jemandem geschrieben wurde, der schon lange andere leichte Sprachen geschrieben hat, ist das Python, das ich geschrieben habe, etwas steif und Java-ähnlich. Ich schreibe jetzt seit zwei Jahren Python, daher denke ich, dass der Java-Geruch verschwunden ist, aber ich werde mich weiterhin jeden Tag widmen.

Recommended Posts

Was ist fehlgeschlagen, als ich von Javaer zu Pythonista gewechselt bin?
Was ich beim Update von Python 2.6 auf 2.7 gemacht habe
Was tun, wenn Ubuntu abstürzt?
Worauf ich mich beim Studium von tkinter bezog
Zu beachtende Punkte beim Wechsel von NAOqi OS 2.4.3 zu 2.5.5
Was tun, wenn ein PermissionError in tempfile.mkstemp auftritt?
Was tun, wenn beim Konvertieren von PySparkDataFrame in PandasDataFrame ein Speicherfehler auftritt?
Summe von 1 bis 10
curl: (60) Was tun, wenn das Ausstellerzertifikat ungültig ist?
Was tun, wenn gdal_merge eine große Datei generiert?
Was tun, wenn ValueError, "nicht unterstützter Hash-Typ" ausgelöst wird?
Python - Hinweise beim Konvertieren vom Typ str in den Typ int
Beschleunigen Sie die Verbindung von cx_Oracle zur autonomen Datenbank
Was tun, wenn "Name xxx nicht importiert werden kann" [Python]
Wovon ich süchtig war, als ich Python Tornado benutzte
Was tun, wenn unter Linux die Fehlermeldung "Namensauflösung vorübergehend fehlgeschlagen" ausgegeben wird?