Ich bin gestorben, weil ich dachte, eine Python-Klassenvariable sei eine Instanzvariable

Unabhängig davon, wie oft ich die Instanz neu erstellt habe, hat sich die Variable, die ich mit init () erstellen wollte, nicht geändert, und ich war monatelang süchtig danach.

Fazit

Ich habe es falsch verstanden, seit ich angefangen habe, Python zu schreiben

class H:
  val = 1        <-------das ist
  
  def __init__(self):
    self.val = 1        <-------Ich dachte, es wäre dasselbe

Es war wirklich so

class H:
  val = 1        <-------Klassenvariable
  
  def __init__(self):
    self.val = 1        <-------Instanzvariable

test code

import datetime, time

#Klassenvariable
class A:
    t = datetime.datetime.today()          #<-----------------#Klassenvariable: Egal wie viele Instanzen Sie erstellen, es ändert sich nicht! !!

class B:
    def __new__(cls):                      # <----------------# __new__Instanzvariable
        self = object.__new__(cls)
        # print('__new__ :', str(id(self)))
        self.t = datetime.datetime.today()
        return self

class C:
    def __init__(self):                 # <----------------# __init__Instanzvariable
        self.t = datetime.datetime.today()

class D:
    def __call__(self):                 # <----------------# __call__Die Instanzvariable ist der Klassenname()Angerufen von. Instanz Instanz.__call__()Das Gefühl, Arbeit zu sparen.
        return datetime.datetime.today()

def start():
    print("-start")
    print(datetime.datetime.today())

    print("-A")
    instance = A()
    print(A.t)           #Nur die Klassenvariable kann direkt von der Klasse aufgerufen werden, keine Instanz
    print(instance.t)    #Holen Sie sich von der Instanz<-----------Gemeinsamer Wert für verschiedene Instanzen (festgelegt durch die Nummer beim ersten Aufruf der Klasse)

    print("-B")
    instance = B()
    print(instance.t)

    print("-C")
    instance = C()
    print(instance.t)

    print("-D")
    instance = D()
    print(instance())    # <---------------- __call__Ist der Klassenname()Angerufen von. Instanz Instanz.__call__()Das Gefühl, Arbeit zu sparen.

##############################################################
if __name__ == "__main__":

    start()
    print("=========================================")
    time.sleep(1)
    start()

result

Ich erstelle eine Instanz neu

-start
2020-01-30 14:29:24.227419
-A
2020-01-30 14:29:24.227217             <-----------Hier
2020-01-30 14:29:24.227217
-B
2020-01-30 14:29:24.227470
-C
2020-01-30 14:29:24.227494
-D
2020-01-30 14:29:24.227516
=========================================
-start
2020-01-30 14:29:25.230648
-A
2020-01-30 14:29:24.227217           <-----------Hier ist der gleiche Orz
2020-01-30 14:29:24.227217
-B
2020-01-30 14:29:25.230766
-C
2020-01-30 14:29:25.230833
-D
2020-01-30 14:29:25.230877

Andere sind anders. Die Klassenvariable war so etwas ...

Stil, um mit voller Kraft durchzukommen

** Hinweise zur Verwendung von Klassenvariablen ** Wenn Sie auf Klassenvariablen zugreifen, sollten Sie vermeiden, auf sie wie "instance.class-Variablen" oder "self.class-Variablen" zuzugreifen, es sei denn, Sie haben einen bestimmten Grund dafür. In Python können Instanzvariablen aus Instanzobjekten erstellt werden, wodurch Klassenvariablen mit Instanzvariablen unbeabsichtigt ausgeblendet werden können. https://uxmilk.jp/41600

Wir geben an verschiedenen Orten unser Bestes. Heul ~. Es war eine Katastrophe ...

Zusammenfassung

Lassen Sie uns Python in der Atmosphäre stoppen

Recommended Posts

Ich bin gestorben, weil ich dachte, eine Python-Klassenvariable sei eine Instanzvariable
Ich habe eine Klasse in Python3 und Java geschrieben
Python: Klassen- und Instanzvariablen
Python-Klassen- und Instanzvariablen
Python: Ich habe es mit Lügner und Ehrlichkeit versucht
Python-Klassendefinitionen und Instanzbehandlung
[Python] -Klasse, Instanz
Python-Klasse, Instanz
Python: Bereiten Sie einen Serializer für die Klasseninstanz vor:
Python-Memo- "wenn nicht A und B" war "wenn (nicht A) und B"
Über Klasse und Instanz
Ich möchte eine Variable in einen Python-String einbetten
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
Nehmen Sie eine Instanz einer Python-Ausnahmeklasse nicht direkt als Argument für die Ausnahmeklasse!
Eine Geschichte, die bei mglearn.plots.plot_nmf_faces nicht mehr funktioniert und sich gefragt hat, ob es sich um einen Fehler handelt?
So erstellen Sie eine Instanz einer bestimmten Klasse aus dict mit __new__ () in Python
Ich war überrascht, eine nette Rezension zu erhalten, als ich Python an CheckIO und seine Erklärung schrieb
Ich dachte an einen Anfängerkurs über Python, der auf Blockchain-Spielen basiert
Ich habe einen Fehler in vim oder zsh in der Python 3.7-Serie
Überlegen Sie, ob das Programmieren in Python und C ein Anime war
Referenzreihenfolge von Klassenvariablen und Instanzvariablen in "self. Klassenvariablen" in Python
Ich habe Chatbot mit LINE Messaging API und Python erstellt
Was ist eine Instanzvariable?
Ich habe einen Python-Text gemacht
Eine Geschichte über das Schreiben von AWS Lambda und ein wenig Abhängigkeit von den Standardwerten von Python-Argumenten
Ich möchte die Frage nach der Methode "__init__" und dem Argument "self" der Python-Klasse klären.
Ich habe eine einfache Schaltung mit Python gemacht (AND, OR, NOR, etc.)
[Road to Intermediate Python] Rufen Sie eine Klasseninstanz wie eine Funktion mit __call__ auf
Ich habe mit Python, Flask und Heroku ein Nyanko-Tweet-Formular erstellt
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Es fiel mir schwer, meine Hausaufgaben zu machen, deshalb verwendete ich Python für das Management Accounting.
[Python] Ich habe eine REST-API mit AWS API Gateway und Lambda geschrieben.
Ich habe Chatbot mit der LINE Messaging API und Python (2) ~ Server ~ erstellt
[Python] Ich habe eine Klasse erstellt, die schnell einen Dateibaum schreiben kann
Python a + = b und a = a + b sind unterschiedlich
Ich habe einen Line-Bot mit Python gemacht!
Ich habe mit Python eine Lotterie gemacht.
Ich habe eine SMS mit Python gesendet
Ich habe eine App für Ausländer erstellt, die Japan in Hackason besuchen, und einen Preis gewonnen, aber als ich mir das genau überlegte, war es nutzlos.
Ich habe mit PyQt5 und Python3 gespielt
Perl-Objekt und Python-Klasse Teil 1.
[Python] gibt A [oder / und] B zurück
[Python] Erbt eine Klasse mit Klassenvariablen
Ich habe mit Python einen Daemon erstellt
Python-Klassen und -Instanzen, Instanzmethoden
Über das Starten einer Instanz mit einem verschlüsselten EBS-Volume (wo ich süchtig war)
Ich war süchtig danach, eine Python-Venv-Umgebung mit VS Code zu erstellen
Tipps: [Python] Stellt ein Array nach dem Zufallsprinzip wieder her und extrahiert es aus einer Fasta-Datei
[Python] Erstellen Sie einen Linebot, um den Namen und das Alter auf das Bild zu schreiben
Ich habe Umgebungsvariablen in Docker festgelegt und in Python angezeigt.
Ein Python-Programm, das die Größe eines Videos ändert und es in ein Bild verwandelt
Treffen Sie eine Methode einer Klasseninstanz mit der Python Bottle Web API
Der Dateiname war in Python schlecht und ich war süchtig nach Import
Ich möchte einen Teil der Excel-Zeichenfolge mit Python einfärben
[Python] Ich war eine Stunde lang begeistert, als ich versuchte, die Listeneinschlussnotation zu verwenden
[Python] Es war sehr praktisch, die Python-Klasse für das ROS-Programm zu verwenden.
Ich möchte eine Webanwendung mit React und Python Flask erstellen