[PYTHON] Wenn Sie eine Methode in einer Ruby-Klasse definieren und dann eine Methode darin definieren, wird sie zu einer Methode der ursprünglichen Klasse.

Ich war ein wenig überrascht, deshalb werde ich ein Code-Stück und eine kurze Erklärung schreiben.

sample.rb


class A
  def a1
    def a2
      'a2'
    end
    'a1'
  end
end

output1


irb(main):013:0> obj1 = A.new
=> #<A:0x00000002500198>
irb(main):014:0> obj1.a1
=> "a1"
irb(main):015:0> obj1.a2
=> "a2"

Wie Sie sehen können, definiert der Aufruf von a1 a2 dynamisch als Instanzmethode von A. Übrigens existiert a2 nur, wenn a1 aufgerufen wird.

output2


irb(main):009:0> obj2 = A.new
=> #<A:0x000000011b7398>
irb(main):010:0> obj2.a2
NoMethodError: undefined method `a2' for #<A:0x000000011b7398>
        from (irb):10
        from /usr/bin/irb:11:in `<main>'

Da a2 als Instanzmethode von A definiert ist (da es häufig von Instanzen von A referenziert wird), kann es für alle Objekte aufgerufen werden, bis das Programm beendet oder explizit aus A entfernt wird.

output3


irb(main):009:0> obj3 = A.new
=> #<A:0x00000001106f70>
irb(main):010:0> obj3.a1
=> "a1"
irb(main):011:0> obj3.a2
=> "a2"
irb(main):012:0> obj4 = A.new
=> #<A:0x00000001118888>
irb(main):013:0> obj4.a2
=> "a2"

Diese Geschichte finden Sie übrigens in Metaprogramming Ruby 2nd Edition, S. 111.

Wäre es so, als würde man dasselbe mit Python machen?

sample.py


class A:
  def a1(self):
    self.__class__.a2 = lambda cls: 'a2'
    return 'a1'

output4


>>> obj1 = A()
>>> obj1.a1()
'a1'
>>> obj1.a2()
'a2'
>>> obj2 = A()
>>> obj2.a2()
'a2'

Wenn dies der Fall ist, habe ich immer noch das Gefühl, dass ich es gewaltsam mache und es ist sicher (?).

Recommended Posts

Wenn Sie eine Methode in einer Ruby-Klasse definieren und dann eine Methode darin definieren, wird sie zu einer Methode der ursprünglichen Klasse.
Wenn Sie einen Singleton in Python möchten, stellen Sie sich das Modul als Singleton vor
Sie können die Methode der Klasse direkt in Python3 aufrufen, ohne @staticmethod hinzuzufügen
Wenn ihr in der Scope-Küche das mit einem Rand machen könnt ~ ♪
Definieren Sie den Teilungswert in Django und spiegeln Sie ihn einfach auf dem Bildschirm wider
[Python] Wäre es nicht das Beste und Höchste, wenn Sie die Unternehmensmerkmale mit nlplot erfassen könnten?
Das Ergebnis der Erstellung eines Kartenalbums italienischer Jungvermählten in Python und dessen Weitergabe
Verwendung der Methode __call__ in der Python-Klasse
Wenn Sie ein Argument in die Abschlussfunktion einfügen und später ausführen möchten
Verschrotten Sie den Zeitplan von Hinatazaka 46 und spiegeln Sie ihn in Google Kalender wider
Was tun, wenn Sie nach dem Durchsuchen einer Textdatei Übereinstimmungen mit Binärdateien (Standardeingabe) erhalten?
Löschen Sie ein bestimmtes Zeichen in Python, wenn es das letzte ist
Wenn Sie eine Liste mit dem Standardargument der Funktion angeben ...
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
[Python] Die Rolle des Sterns vor der Variablen. Teilen Sie den Eingabewert und weisen Sie ihn einer Variablen zu
Ich möchte die Frage nach der Methode "__init__" und dem Argument "self" der Python-Klasse klären.
[Python / Jupyter] Übersetzen Sie den Kommentar des in die Zwischenablage kopierten Programms und fügen Sie ihn in eine neue Zelle ein.
Wenn Sie den Ausführungsbenutzer mitten in einer Fabric-Aufgabe wechseln möchten, stellen Sie den Kontextmanager ein
Prognostizieren Sie den Stromverbrauch in 2 Tagen und veröffentlichen Sie ihn in CSV
Bis Sie einen Schnappschuss des Amazon Elasticsearch-Dienstes erhalten und wiederherstellen
Schließen Sie das Cat-Ergebnis in doppelte Anführungszeichen ein und setzen Sie es in eine Variable
Treffen Sie eine Methode einer Klasseninstanz mit der Python Bottle Web API
Wenn in boto3 der Fehler no attribute angezeigt wird, überprüfen Sie die Version
Suchen Sie es in der Warteschlange und bearbeiten Sie es
Darstellung von Containern in einem verschachtelten Rahmen (schematisch) in Jupyter und was ich bei der Erstellung untersucht habe
Ein einfacher Mock-Server, der den HTTP-Anforderungsheader einfach in den Hauptteil der Antwort einbettet und zurückgibt.
So speichern Sie die Feature-Point-Informationen des Bildes in einer Datei und verwenden sie zum Abgleichen
Erstellen Sie eine einfache App, die die Fetch-API für Ajax-Anforderungen in Flask enthält, und erklären Sie sie schnell.
Eine Lösung, wenn Sie versehentlich den Python-Interpreter in / usr / local / bin / entfernen.
Ich habe die Geschwindigkeit regulärer Ausdrücke in Ruby, Python und Perl (Version 2013) verglichen.
Teilt die Zeichenfolge durch die angegebene Anzahl von Zeichen. In Ruby und Python.
So zählen Sie die Anzahl der Elemente in Django und geben sie in die Vorlage aus
Ändern Sie in Python das Verhalten der Methode je nach Aufruf
Überprüfen Sie mit einem Test, wie oft die Abfrage (SQL) in Django ausgelöst wurde
Sie wandeln spiralförmig in einer Welt, in der sich die Wände des Kreuzes erheben (Simulation)
Ich musste im Unterricht keinen Dekorateur schreiben. Danke Kontextmanager
Bis Sie tägliche Daten für mehrere Jahre japanischer Bestände erhalten und diese in einer einzigen CSV (Python) speichern
Holen Sie sich den Aufrufer einer Funktion in Python
Angeben des Bereichs von Ruby- und Python-Arrays
Ich habe eine Klasse in Python3 und Java geschrieben
Kopieren Sie die Liste in Python
Finden Sie die Anzahl der Tage in einem Monat
Selbst wenn Sie ein Python-Anfänger sind und weniger als ein Jahr Pferderennen haben, konnten Sie ein Triple gewinnen.
Ausgabe in Form eines Python-Arrays
In Bash "Löschen Sie die Datei, falls vorhanden".
Berücksichtigung der Stärken und Schwächen von Python
[Python3] Machen Sie einen Screenshot einer Webseite auf dem Server und schneiden Sie sie weiter zu
[Python] Ändern Sie die Textfarbe und Hintergrundfarbe eines bestimmten Schlüsselworts in der Druckausgabe
[Selen] Öffnen Sie den Link in einem neuen Tab und verschieben Sie ihn [Python / Chrome-Treiber]
[Shell Art] Nur wenn es ein Vielfaches von 3 ist und eine Zahl mit 3 dumm wird
So überprüfen Sie in Python, ob sich eines der Elemente einer Liste in einer anderen Liste befindet
Python-Ertrag verstehen Wenn Sie Ertrag in eine Funktion einfügen, wird dieser in einen Generator geändert
Wenn Sie sich für Datenwissenschaftler interessieren, schauen Sie sich zuerst hier um, eine Zusammenfassung der Literatur und Videos (nach Bedarf hinzugefügt).
Überprüfen Sie, ob die Zeichenfolge eine Zahl in Python ist
Unterschied zwischen Ruby und Python in Bezug auf Variablen
Lesen Sie die CSV-Datei und zeigen Sie sie im Browser an
Python-Implementierung der Bayes'schen linearen Regressionsklasse
Überprüfen Sie, ob es sich um Unix in der Skriptsprache handelt
Shell-Programm, das in Vielfachen von 3 aho wird
Wenn in Python ein "Unicode-Dekodierungsfehler" auftritt