10
votes

Equivalent python de PHPS __Call () Méthode magique?

en php, je peux faire quelque chose comme ceci:

class MyClass
{
  function __call($name, $args)
  {
    print('you tried to call a the method named: ' . $name);
  }
}
$Obj = new MyClass();
$Obj->nonexistant_method();   // prints "you tried to call a method named: nonexistant_method"


0 commentaires

3 Réponses :


1
votes

Vous voulez probablement __ getattr __ , bien qu'il fonctionne sur des attributs de classe ainsi que des méthodes (car les méthodes ne sont que des attributs qui sont des fonctions).


0 commentaires

17
votes

Définir un __getTR__ méthode sur votre objet, et retourne une fonction (ou une fermeture) de celle-ci.

In [1]: class A:
   ...:     def __getattr__(self, name):
   ...:         def function():
   ...:             print("You tried to call a method named: %s" % name)
   ...:         return function
   ...:     
   ...:     

In [2]: a = A()

In [3]: a.test()
You tried to call a method named: test


3 commentaires

Assez bien, bien que cela puisse également être utile de définir la fonction imbriquée comme fonction (* args) de sorte que le corps puisse utiliser à la fois le nom de la fonction et les arguments passés. Cela dépend de ce que Keith veut que les méthodes fassent. (Bien sûr, s'il n'y a jamais jamais eu d'arguments à aucune des méthodes, __ getattr __ peut renvoyer le résultat, simulant ainsi des champs au lieu de méthodes.)


Je veux en fait vouloir pouvoir également obtenir les arguments de la fonction. Est le seul changement nécessitaire pour définir la fonction def (): comme fonction DEF (* args) :? Ou dois-je faire autre chose aussi? (Python Newbie, désolé!)


@Keith: Si la fonction prend des arguments arbitraires, mettez ensuite * args dans la liste des arguments et il recevra un tuple avec tous les arguments. S'il s'agit d'un nombre fixe d'arguments, vous pouvez simplement aller de l'avant et définir la fonction (A, B) directement, par exemple, pour prendre deux arguments.



0
votes

Je cherchais la même chose, mais depuis que la méthode appelante est une opération en deux étapes comme: * 1. Obtenir l'attribut (Obj. _ getattr _ ) * 2. Appliquez-le (obtenu Objecte. _ appel _ )

Il n'y a pas de méthode magique qui prédit les deux actions.


0 commentaires