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"
3 Réponses :
Vous voulez probablement __ getattr __ code>, 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). P>
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
Assez bien, bien que cela puisse également être utile de définir la fonction imbriquée comme fonction (* args) code> 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 __ code> 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 code> 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) code> directement, par exemple, pour prendre deux arguments.
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 em> _ strong>)
* 2. Appliquez-le (obtenu Objecte. _ appel em> _ strong>) p>
Il n'y a pas de méthode magique qui prédit les deux actions. P>