Ändern Sie in Python das Verhalten der Methode je nach Aufruf

Normale Definition und Anrufergebnis

In Python-Klassen gibt es drei Arten von Methoden.

class C:
  val = 20
  def __init__(self):
    self.val = 1
  def normal_method(self, v):
    return self.val + v + 2
  @classmethod
  def class_method(cls, v):
    return cls.val + v + 3
  @staticmethod
  def static_method(v):
    return C.val + v + 4

i = C()
i.normal_method(5)    # i.val + 5 + 2 = 1 + 5 + 2 = 8
i.class_method(6)     # C.val + 6 + 3 = 20 + 6 + 3 = 29
i.static_method(7)    # C.val + 7 + 4 = 20 + 7 + 4 = 31
C.normal_method(5)    # requires 2 args but 1: error
C.normal_method(i, 6) # i.val + 6 + 2 = 1 + 6 + 2 = 9
C.normal_method(C, 7) # C.val + 7 + 2 = 20 + 7 + 2 = 29
C.class_method(8)     # C.val + 8 + 3 = 20 + 8 + 3 = 31
C.static_method(9)    # C.val + 9 + 4 = 20 + 9 + 4 = 33

Ändern Sie das Verhalten je nach Aufruf der Methode

Normale Methoden sind immer noch Funktionen.

Wenn man dies als Gegenprodukt betrachtet, kann das Verhalten durch das erste Argument geändert werden.

class C:
  #Hinzu kommt
  def trick_method(arg, v):
    if isinstance(arg, C):
      return arg.val * 2 * v
    else:
      return C.val + arg * v

i.trick_method(4)    # i.val * 2 * 4 = 1 * 2 * 4 = 8
C.trick_method(5)    # requires 2 args but 1: error
C.trick_method(6, 7) # C.val + 6 * 7 = 20 + 6 * 7 = 62
C.trick_method(i, 8) # i.val * 2 * 8 = 1 * 2 * 8 = 16
C.trick_method(C, 9) # C.val + C * v: error

Das obige "trick_method ()" verhält sich wie eine normale Methode über eine Instanz und wie eine statische Methode über eine Klasse.

Wenn das Verhalten anders ist, sollte es normalerweise eine andere Methode sein.

Illustration

Ich habe mir beim Erstellen einer Klasse, die Instanzen als Gruppe verwaltet, eine so seltsame Verwendung ausgedacht.

class Student:
  rooms = {}
  def __init__(self, room):
    self.myroom = room
    if not room in Student.rooms:
      Student.rooms [room] = []
    Student.rooms [room].append(self)

  def classmates(self_or_room):
    if isinstance(self_or_room, Student):
      self = self_or_room
      for s in Student.rooms[self.myroom]:
        if s != self:
          yield s
    elif self_or_room in Student.rooms:
      room = self_or_room
      return iter(Student.rooms[room])

Ann = Student('3-A')
Bob = Student('3-B')
Cathy = Student('3-B')
Dan = Student('3-A')
Ellen = Student('3-A')
Fred = Student('3-B')

mates_of_ann = Ann.classmates() # Dan, Ellen
mates_of_3A = Student.classmates('3-A') # Ann, Dan, Ellen

mates_of_bob = Bob.classmates() # Cathy, Fred
mates_of_3B = Student.classmates('3-B') # Bob, Cathy, Fred

Hinweis

Diese Methode kann nicht mit Methoden mit Dekoratoren verwendet werden (z. B. "@ property" oder "@ classmethod").

Recommended Posts

Ändern Sie in Python das Verhalten der Methode je nach Aufruf
Den Namen der Methode, die ihn aufgerufen hat, finden Sie in der Python-Methode
Unterschied in sys.path abhängig davon, wie Python gestartet wird (v3.8.2)
Wie ist der Fortschritt? Lassen Sie uns mit dem Boom in Python weitermachen
Überprüfen Sie das Verhalten des Zerstörers in Python
Der Rückgabewert von len oder unichr kann sich ändern, je nachdem, ob es sich um UCS-2 oder UCS-4 handelt.
Wie sich die Referenz des Python-Arrays ändert, hängt vom Vorhandensein oder Fehlen von Indizes ab
So ermitteln Sie die Anzahl der Stellen in Python
Unterschied in den Ergebnissen abhängig vom Argument von multiprocess.Process
rsync Das Verhalten ändert sich abhängig vom Vorhandensein oder Fehlen des Schrägstrichs der Kopierquelle
So überprüfen Sie in Python, ob sich eines der Elemente einer Liste in einer anderen Liste befindet
Wie stark ist dein Qiita? Statistiken über die Anzahl der in den Daten angezeigten Beiträge
Hinweis zum Standardverhalten von collate_fn in PyTorch
Test.py wird auf dem Webserver in Python3 nicht angezeigt.
Der AWS IP-Bereich ist je nach Erfassungsmethode unterschiedlich.
Sakura Die Geschichte, wie die Python-Flasche im Internet funktioniert hat
Verwendung der Methode __call__ in der Python-Klasse
So bestimmen Sie die Existenz eines Selenelements in Python
So ändern Sie die Protokollstufe von Azure SDK für Python
Leider gibt es kein Gefühl der Einheit in der where-Methode
Wie Sie die interne Struktur eines Objekts in Python kennen
So ändern Sie die Farbe nur der mit Tkinter gedrückten Taste
Wie einfach ist es, ein Medikament auf dem Markt zu synthetisieren?
So überprüfen Sie die Speichergröße einer Variablen in Python
Löschen Sie ein bestimmtes Zeichen in Python, wenn es das letzte ist
So stellen Sie fest, dass in Python3 ein Kreuzschlüssel eingegeben wurde
Fühlen Sie sich frei, das Legendenlabel mit Seaborn in Python zu ändern
Verwendung von Sternchen (*) in Python. Vielleicht ist das alles? ..
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
So aktualisieren Sie die Python-Version von Cloud Shell in GCP
Ich habe viel recherchiert, wie Python ausgeführt wird
Holen Sie sich die Anzahl der Leser von Artikeln über Mendeley in Python
Ein einfacher Grund, warum der Rückgabewert von round (2.675,2) in Python 2,67 beträgt (in Wirklichkeit sollte er 2,68 betragen ...)
Ändern Sie die Länge der Python-CSV-Zeichenfolgen
Verhaltensänderung von [Diagramm / Zeitleiste] in Choregraphe 2.5.5.5
Ändern Sie die Sättigung und Helligkeit von Farbspezifikationen wie # ff000 in Python 2.5
Lassen Sie uns das Farbschema von iTerm2 je nach Tageszeit automatisch ändern
Das Ergebnis der Installation von Python auf Anaconda
[Java] [Linux] Untersuchen, wie die Implementierung von untergeordneten Java-Prozessen unter Linux realisiert wird
Was ist "Mahjong" in der Python-Bibliothek? ??
[Python] [Meta] Ist der Python-Typ ein Typ?
Grundlagen zum Ausführen von NoxPlayer in Python
Was für ein Buch ist der meistverkaufte "Python Crash Course" der Welt?
Ändern Sie die Reihenfolge von PostgreSQL in Heroku
Auf der Suche nach dem schnellsten FizzBuzz in Python
[Einführung in Python] Wie wird mit der continue-Anweisung wiederholt?
Verwendung ist und == in Python
So geben Sie eine Zeichenfolge in Python ein und geben sie unverändert oder in die entgegengesetzte Richtung aus.
Eine Geschichte über einen Ingenieur, der das Emo der Kryptographie bemerkt hat und versucht, es in Python zu implementieren
So übergeben Sie das Ergebnis der Ausführung eines Shell-Befehls in einer Liste in Python
[Linux] Unterschied in den Zeitinformationen in Abhängigkeit von der Uhr-ID der Funktion clock_gettime ()
Ich möchte Python in der Umgebung von pyenv + pipenv unter Windows 10 verwenden
Wenn verzweigen, hängt davon ab, ob die Liste ein bestimmtes Element enthält
Ich war in Schwierigkeiten, weil sich das Verhalten des Docker-Containers nicht geändert hat
Lassen Sie uns automatisch den Text des Songs anzeigen, der in Python in iTunes abgespielt wird
[Python] So benennen Sie Tabellendaten und geben sie mit csv aus (to_csv-Methode)
Legen Sie die Obergrenze für die Anzahl der Wiederholungen rekursiver Funktionen in Python fest
Unterschiede im Verhalten jeder LL-Sprache, wenn der Listenindex übersprungen wird