Si vous définissez une méthode dans une classe Ruby, puis définissez une méthode dans celle-ci, elle devient une méthode de la classe d'origine.

J'ai été un peu surpris, donc je vais écrire un morceau de code et une brève explication.

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"

Comme vous pouvez le voir, l'appel à a1 définit dynamiquement a2 comme une méthode d'instance de A. Au fait, a2 n'existe que si a1 est appelé.

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>'

Puisque a2 est défini comme une méthode d'instance de A (car il est généralement référencé par des instances de A), il peut être appelé sur tous les objets jusqu'à ce que le programme se termine ou soit explicitement supprimé de A.

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"

À propos, cette histoire peut être trouvée dans Metaprogramming Ruby 2nd Edition, p111.

Serait-ce comme faire la même chose avec python?

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'

Si tel est le cas, j'ai toujours l'impression de le faire de force et c'est sûr (?).

Recommended Posts

Si vous définissez une méthode dans une classe Ruby, puis définissez une méthode dans celle-ci, elle devient une méthode de la classe d'origine.
Si vous voulez un singleton en python, considérez le module comme un singleton
Vous pouvez appeler la méthode de la classe directement dans Python3 sans ajouter @staticmethod
Si vous les gars dans la cuisine de portée pouvez le faire avec une marge ~ ♪
Définir la valeur de division dans Django et la refléter facilement à l'écran
[Python] N'est-ce pas le plus élevé et le plus élevé si vous pouvez saisir les caractéristiques d'une entreprise avec nlplot?
Le résultat de la création d'un album de cartes de jeunes mariés italiens en Python et de son partage
Comment utiliser la méthode __call__ dans la classe Python
Si vous voulez mettre un argument dans la fonction de fermeture et l'exécuter plus tard
Racler le calendrier de Hinatazaka 46 et le refléter dans Google Agenda
Que faire lorsque vous obtenez des correspondances de fichier binaire (entrée standard) après la greffe d'un fichier texte
Supprimer un caractère spécifique en Python s'il s'agit du dernier
Si vous donnez une liste avec l'argument par défaut de la fonction ...
Une fonction qui mesure le temps de traitement d'une méthode en python
[Python] Le rôle de l'astérisque devant la variable. Divisez la valeur d'entrée et affectez-la à une variable
Je veux clarifier la question de la méthode "__init__" et de l'argument "self" de la classe Python.
[Python / Jupyter] Traduisez le commentaire du programme copié dans le presse-papiers et insérez-le dans une nouvelle cellule.
Si vous souhaitez changer d'utilisateur d'exécution au milieu d'une tâche Fabric, le gestionnaire de contexte des paramètres
Prédisez la quantité d'énergie utilisée en 2 jours et publiez-la au format CSV
Jusqu'à ce que vous obteniez un instantané du service Amazon Elasticsearch et que vous le restauriez
Mettez le résultat du chat entre guillemets et mettez-le dans une variable
Hit une méthode d'une instance de classe avec l'API Web Python Bottle
Si vous obtenez une erreur sans attribut dans boto3, vérifiez la version
Trouvez-le dans la file d'attente et modifiez-le
Représenter des conteneurs dans un cadre imbriqué (schéma) dans Jupyter, et ce que j'ai étudié en cours de création
Un simple serveur simulé qui incorpore simplement l'en-tête de la requête HTTP dans le corps de la réponse et le renvoie.
Comment enregistrer les informations de point caractéristique de l'image dans un fichier et l'utiliser pour la mise en correspondance
Créez une application simple qui intègre l'API Fetch pour les requêtes Ajax dans Flask et expliquez-la rapidement.
Une solution si vous supprimez accidentellement l'interpréteur python dans / usr / local / bin /.
J'ai comparé la vitesse des expressions régulières en Ruby, Python et Perl (version 2013)
Divise la chaîne de caractères par le nombre de caractères spécifié. En Ruby et Python.
Comment compter le nombre d'éléments dans Django et sortir dans le modèle
En Python, changez le comportement de la méthode en fonction de la façon dont elle est appelée
Vérifiez le nombre de fois où la requête (sql) a été lancée dans django avec un test
Vous marchez en spirale dans un monde où les murs de la croix s'élèvent (simulation)
Je n'ai pas eu besoin d'écrire décorateur en classe Merci contextmanager
Jusqu'à ce que vous obteniez des données quotidiennes pour plusieurs années de stock japonais et que vous les sauvegardiez dans un seul CSV (Python)
Récupérer l'appelant d'une fonction en Python
Spécification de la plage des tableaux ruby et python
J'ai écrit une classe en Python3 et Java
Copiez la liste en Python
Trouvez le nombre de jours dans un mois
Même si vous êtes un débutant en python et que vous avez moins d'un an de courses de chevaux, vous avez pu gagner un triple.
Sortie sous la forme d'un tableau python
Dans bash, "supprimez le fichier s'il existe".
Prise en compte des forces et faiblesses de Python
[Python3] Prenez une capture d'écran d'une page Web sur le serveur et recadrez-la davantage
[Python] Changer la couleur du texte et la couleur d'arrière-plan d'un mot clé spécifique dans la sortie d'impression
[Selenium] Ouvrez le lien dans un nouvel onglet et déplacez-le [Pilote Python / Chrome]
[Art de la coquille] Seulement quand c'est un multiple de 3 et un nombre avec 3 devient stupide
Comment vérifier en Python si l'un des éléments d'une liste est dans une autre liste
Comprendre le rendement Python Si vous mettez le rendement dans une fonction, elle se transforme en générateur
Si vous êtes intéressé par les data scientists, regardez d'abord ici, un résumé de la littérature et des vidéos (ajoutées au besoin)
Vérifiez si la chaîne est un nombre en python
Différence entre Ruby et Python en termes de variables
Lisez le fichier csv et affichez-le dans le navigateur
Implémentation python de la classe de régression linéaire bayésienne
Vérifiez s'il s'agit d'Unix dans le langage de script
Programme Shell qui devient aho par multiples de 3
Si vous rencontrez une "erreur de décodage Unicode" en Python