Python-Klassendefinitionen und Instanzbehandlung

Informationen zur Klassendefinition und Instanzbehandlung

Als ich eine Zusammenfassung machte, die auch als Memorandum unter [hier] diente (http://qiita.com/hiroykam/items/2fea445fd2d489354c34), bemerkte oder entdeckte ich sie erneut, daher möchte ich sie hier beschreiben.

Klassenvariablen und Instanzvariablen

Einführung

Ein Beispiel, das "Hello World" ausgibt. Definieren Sie die Klassenvariable c_var bzw. die Instanzvariable i_var.

class Test(object):
    c_var = "Hello"

    def __init__(self):
        self.i_var = "World"

    def __str__(self):
        return Test.c_var + " " + self.i_var

print(Test())

Überprüfung von Klassenvariablen und Instanzvariablen (Teil 1)

Validiert mit einem Muster, das eine Instanzvariable mit demselben Namen wie eine Klassenvariable (exam1) definiert, und einem Muster, das eine Klassenvariable modifiziert ( exam2).

class Test(object):
    c_var = "Hello"

    def __init__(self):
        self.i_var = "World"

    def __str__(self):
        return Test.c_var + " " + self.i_var

    def examine1(self):
        self.c_var = "Hey"
        return self

    def examine2(self):
        Test.c_var = "Hey"
        return self

t = Test()
print(t.examine1())
print(t.examine2())
print(Test())

Aus dem Ausgabeergebnis ist ersichtlich, dass die Klassenvariable und die Instanzvariable unterschiedlich sind und die Instanzvariable geändert werden kann.

Ausgabeergebnis


Hello World
Hey World
Hey World

Sie können die Instanzvariable mit vars (t) und die Klassenvariable mit vars (Test) überprüfen.

Überprüfung von Klassenvariablen und Instanzvariablen (Teil 2)

Versuchen Sie nun, die Klassenvariablen mit Klassen- und statischen Methoden anstelle von Methoden zu ändern. Aus dem Ausgabeergebnis werden beide __init__ aufgerufen und die Klassenvariablen wurden geändert.

class Test(object):
    c_var = "Hello"

    def __init__(self):
        self.i_var = "World"

    def __str__(self):
        return Test.c_var + " " + self.i_var

    @classmethod
    def class_method(cls):
        cls.c_var = "Class"

    @staticmethod
    def static_method():
        Test.c_var = "Static"

Test.class_method()
print(Test())
Test.static_method()
print(Test())

Ausgabeergebnis


Class World
Static World

Überprüfung von Klassenvariablen und Instanzvariablen (Teil 3)

Lassen Sie uns nun die Änderungen an Klassenvariablen und Instanzvariablen untersuchen, wenn flache und tiefe Kopien erstellt werden. Selbst in einer tiefen Kopie hat sich der Wert der Klassenvariablen geändert.

import copy


class Test(object):
    c_var = 2

    def __init__(self, obj):
        self.i_var = obj

    def __str__(self):
        return "{0} {1}".format(Test.c_var, self.i_var)

    def examine1(self):
        self.i_var += 2
        return self

    def examine2(self):
        Test.c_var += 2
        return self


a = int(3)
t1 = Test(a)
t1.examine1().examine2()
print(t1)
print(Test(a))

print("--- shallow copy ---")

t2 = copy.copy(t1)
t2.examine1().examine2()
print(t1)
print(t2)
print(Test(a))

print("--- deep copy ---")

t3 = copy.deepcopy(t1)
t3.examine1().examine2()
print(t1)
print(t2)
print(t3)
print(Test(a))

Ausgabeergebnis


4 5
4 3
--- shallow copy ---
6 5
6 7
6 3
--- deep copy ---
8 5
8 7
8 7
8 3

Erstes Argument der Methode "self"

Eine Klasse, die zwei Methoden definiert: "Probe1" und "Prüfen2".

class Test(object):
    def __init__(self):
        self.i_var = "nothing"

    def __str__(self):
        return self.i_var

    def examine1(self):
        self.i_var = "examine1"
        return self

    def examine2(self):
        self.i_var = "examine2"
        return self

t1 = Test()
print(t1)
print(t1.examine1())
print(t1.examine2())

Das Ausgabeergebnis ist wie folgt.

Ausgabeergebnis


nothing
examine1
examine2

Als ich hier "print (Test.examin1 ())" wie eine Klassenmethode ausführte, bekam ich natürlich einen Fehler.

Error


examine1() missing 1 required positional argument: 'self'

Ist es also möglich, eine Instanz im ersten Argument "self" anzugeben?

t1 = Test()
print(Test.examine1(t1.examine2()))
print(Test.examine2(t1.examine1()))

Als das obige ausgeführt wurde, wurde das folgende Ergebnis ausgegeben.

Ausgabeergebnis


examine1
examine2

aufrufbare Klasse

Beispiel für eine aufrufbare Klasse

Zusammenfassung präsentierte mir eine anrufbare Klasse, und gleichzeitig war ich mir meines Mangels an Studien sehr bewusst.

class Callable(int):
    def __call__(self, *arguments):
        print(arguments[0])

a = Callable(5)
print(a)
a(3)

Ausgabeergebnis


5
3

Das Obige bedeutet, dass "a" sowohl als Funktion als auch als Variable verwendet werden kann. Da der Referenzwert der "Callable" -Instanz "a" zugewiesen ist, wird der Wert, der beim Erstellen der Instanz als Argument übergeben wird, durch "print (a)" angezeigt. Wenn "a" wie eine Funktion aufgerufen wird, wird "call" aufgerufen, sodass der Wert des ersten Arguments "print" ist.

Beispiel für die Verwendung einer aufrufbaren Klasse

Eine Implementierung, die "int" auf "callable" erweitert und das erste Argument als Einheit (Name) in einem Funktionsaufruf behandelt. Ersetzen der Standardklasse "int" durch "int = Callable".

class Callable(int):
    def __call__(self, unit):
        print("{0} {1}".format(self, unit))

int = Callable
print(int("3") * 4)
int("5")("meters")
int(2017 - 2010)("years old")
12
5 meters
7 years old

Veränderbares numerisches Objekt

Wir haben eine Klasse vorbereitet, die __add__ und __sub__ implementiert. Der Referenzwert ändert sich auch dann nicht, wenn er wie unten gezeigt addiert oder subtrahiert wird. Dies ersetzte auch den Standard "int". Der Wert von "id" hat sich nach dem Austausch nicht geändert.

class MyInt(object):
    def __init__(self, v):
        self.__v = v

    def __add__(self, other):
        self.__v += other
        return self

    def __sub__(self, other):
        self.__v -= other
        return self

a = int(2)
print(id(a))
a = a + 3
print(id(a))
a = a - 5
print(id(a))

int = MyInt

a = int(3)
print(id(a))
a = a + 3
print(id(a))
a = a - 5
print(id(a))
1983644176
1983644272
1983644112
1736248227544
1736248227544
1736248227544

__mul__, __matmul__, __truediv__, __floordiv__, __mod__, __divmod__, __pow__, __lshift__, __rshift__, __and__, `_xor Entsprechend umsetzen.

Verwenden Sie veränderbare numerische Objekte mit Klassen- und Instanzvariablen

Ich habe int bei der Überprüfung von Klassenvariablen und Instanzvariablen verwendet (Teil 3), aber ich habe versucht, es mit dem hier definierten veränderlichen numerischen Objekt zu überprüfen. Wie bei unveränderlichen Variablen können Klassenvariablen auch bei einer tiefen Kopie im Wert geändert werden.

import copy


class MyInt(object):
    def __init__(self, v):
        self.__v = v

    def __str__(self):
        return str(self.__v)

    def __add__(self, other):
        self.__v += other
        return self

    def __sub__(self, other):
        self.__v -= other
        return self

int = MyInt


class Test(object):
    c_var = int(2)

    def __init__(self, obj):
        self.i_var = obj

    def __str__(self):
        return "{0} {1}".format(Test.c_var, self.i_var)

    def examine1(self):
        self.i_var += 2
        return self

    def examine2(self):
        Test.c_var += 2
        return self


a = int(3)
t1 = Test(a)
t1.examine1().examine2()
print(t1)
print(Test(a))

print("--- shallow copy ---")

t2 = copy.copy(t1)
t2.examine1().examine2()
print(t1)
print(t2)
print(Test(a))

print("--- deep copy ---")

t3 = copy.deepcopy(t1)
t3.examine1().examine2()
print(t1)
print(t2)
print(t3)
print(Test(a))

Ausgabeergebnis


4 5
4 5
--- shallow copy ---
6 7
6 7
6 7
--- deep copy ---
8 7
8 7
8 9
8 7

Recommended Posts

Python-Klassendefinitionen und Instanzbehandlung
Python: Klassen- und Instanzvariablen
Python-Klassen- und Instanzvariablen
Python-Klasse, Instanz
Über Klasse und Instanz
Ordnungsgemäße Verwendung der Instanzmethode und der Klassenmethode
Perl-Objekt und Python-Klasse Teil 2.
Referenzreihenfolge von Klassenvariablen und Instanzvariablen in "self. Klassenvariablen" in Python
Perl-Objekt und Python-Klasse Teil 1.
Python-Klassen und -Instanzen, Instanzmethoden
Ich war süchtig nach falschen Klassenvariablen und Instanzvariablen in Python
Ich bin gestorben, weil ich dachte, eine Python-Klassenvariable sei eine Instanzvariable
[Python] Unterschied zwischen Klassenmethode und statischer Methode
Modulimport und Ausnahmebehandlung in Python
Apropos Python-Klassenattribute und Metaklassen
"Kanrika" die Python-Klasse
Python-Fehlerbehandlung
Behandlung von Python-Ausnahmen
Python-Zeitzonenbehandlung
Python ist eine Instanz
# Python-Grundlagen (Klasse)
Behandlung von Python-Ausnahmen
Unterschied zwischen Variablen und Selbst. Variablen in der [Python] -Klasse
Ich habe eine Klasse in Python3 und Java geschrieben
Python: Bereiten Sie einen Serializer für die Klasseninstanz vor:
Probleme mit pseudo-privaten Python-Variablen und Klassenvererbung
[Python] Klassentyp und Verwendung des datetime-Moduls
[Python] Komprimieren und dekomprimieren
Python-Syslog-Wrapper-Klasse
Python- und Numpy-Tipps
[Python] Pip und Wheel
Umgang mit Yaml mit Python
Fallklasse in Python
[Python] Konvertieren Sie Allzweckcontainer und Klasse ineinander
Python Iterator und Generator
[Python] Klassenvererbung (super)
Python selbst erstellte Klassensortierung
Grundmethode der [Python] -Klasse
[Hikari-Python] Kapitel 07-01 Ausnahmebehandlung (Fehler und Ausnahmen)
Python-Pakete und -Module
Vue-Cli- und Python-Integration
Ruby, Python und Map
[Python] Klassenvererbung, überschreiben
Python-Eingabe und Ausgabe
Python und Ruby teilen sich
Python-Subprozess-Wrapper-Klasse
[Python] So sortieren Sie Diktate in Listen und Instanzen in Listen
Python, über die Ausnahmebehandlung
Pythons Umgang mit Dezimalstellen
[Hikari-Python] Kapitel 06-01 Funktionen (integrierte Funktionen und Funktionsdefinitionen)
Metaklasse und Instanz
Klassen- und statische Methoden
Umgang mit Hexadezimal in Python3
Python asyncio und ContextVar
YOLO Python-Wrapper-Klasse
Klassennotation in Python
Liste der Python-Ausnahmeklassen
Beispiel für das Abrufen des Modulnamens und des Klassennamens in Python
[Python] Wie man mit Klassenvariablen mit Dekorator und Metaklasse spielt