Qu'est ce qu'un “callable”?
Maintenant qu'il est clair ce qu'est une métaclasse est, il est associé à un concept que j'utilise tout le temps sans savoir ce que cela signifie vraiment.
Je suppose que tout le monde fait une fois une erreur avec la parenthèse, résultant en un "objet n'est pas appelable" l'exception". Qui plus est, en utilisant __init__
et __new__
conduire à se demander ce que cette sanglante __call__
peut être utilisé pour.
Pourriez-vous me donner quelques explications, y compris des exemples avec la méthode magique ?
Vous devez vous connecter pour publier un commentaire.
Un callable est quelque chose qui peut être appelé.
La construit-dans callable (PyCallable_Check dans les objets.c) vérifie si l'argument est soit:
__call__
méthode ouLa méthode nommée
__call__
est (selon la documentation)Exemple
callable
en fait vous indique si quelque chose est remboursable ou non, lors de la vérification pour__call__
vous dit rien; Si un objeto
fournit__getattribute__
ou__getattr__
,hasattr(o, '__call__')
peut renvoyer True, encoreo
sera pas encore exigible parce que Python saute__getattribute__
et__getattr__
pour les appels. La seule véritable façon de gauche à vérifier si quelque chose est appelable est donc l'aeap.callable()
en Python 3.x: "Cette fonction a d'abord été enlevé en Python 3.0 et puis ramené en Python 3.2.".De Python sources objet.c:
Il dit:
__call__
attribut.x
est appelable iffx->ob_type->tp_call != NULL
Desciption de
tp_call
champ:Vous pouvez toujours utiliser les haut-
callable
fonction pour déterminer si l'objet donné est remboursable ou non; ou, mieux encore, il vous suffit d'appeler et d'attraperTypeError
plus tard.callable
est retiré en Python 3.0 et 3.1, l'utilisationcallable = lambda o: hasattr(o, '__call__')
ouisinstance(o, collections.Callable)
.Exemple, simpliste cache de mise en œuvre:
Utilisation:
Exemple de la bibliothèque standard, fichier
site.py
, la définition de l'intégré dansexit()
etquit()
fonctions:def f(): ...
, et la classe des objets tels que desclass C: ...
c'est à dire,f
,''.strip
,len
, etC
tous sont remboursables. Les Instances qui ont une__call__()
méthode dans leur classe sont relativement rares.Un callable est un objet vous permet d'utiliser la ronde des parenthèses ( ) et éventuellement passer certains paramètres, comme les fonctions.
Chaque fois que vous définissez une fonction python crée un objet appelable.
Dans l'exemple, vous pouvez définir la fonction func dans ces formes (c'est la même chose):
Vous pouvez utiliser cette méthode au lieu de méthodes comme doit ou exécuter, je pense que c'est plus clair pour voir obj() de l'obj.doit()
Laissez-moi vous expliquer en arrière:
Considérer cette...
... comme sucre syntaxique pour:
Où
foo
peut être n'importe quel objet qui répond à__call__
. Quand je dis que n'importe quel objet, je veux dire: intégré-types, vos propres classes et de leurs instances.Dans le cas de types intégrés, lorsque vous écrivez:
Vous êtes essentiellement faire:
C'est aussi pourquoi vous n'avez pas
foo = new int
en Python: vous venez de faire l'objet de classe retourner une instance de celui-ci sur__call__
. La façon Python résout c'est très élégant à mon avis.type(int).__call__(int, '10')
ettype(unicode).__call__(unicode, '10')
. Dunders sont toujours appelés sur leur classe, non pas par l'exemple. Et ils ne vont jamais par le biais de la métaclasse soit. Pour la plupart des cas, c'est juste un pinaille, mais c'est important parfois.Un Callable est un objet qui a le
__call__
méthode. Cela signifie que vous pouvez faux appelable de fonctions ou de faire des choses intéressantes comme Partielle De La Fonction De Demande où vous prenez une fonction et ajouter quelque chose qui améliore ou se remplit de certains paramètres, de retour quelque chose qui peut être appelé à son tour (connu sous le nom Nourrissage dans la programmation fonctionnelle des cercles).Certaines erreurs typographiques sera l'interprète de tenter d'appeler quelque chose que vous n'avez pas l'intention, comme (par exemple) une chaîne de caractères. Cela peut produire des erreurs où l'interprète tente d'exécuter un non-rachetable application. Vous pouvez voir ce qui se passe dans un interpréteur python en faisant quelque chose comme la transcription ci-dessous.
__call__
rend n'importe quel objet être appelée comme une fonction.Cet exemple de sortie 8:
Tout simplement, un "callable" est quelque chose qui peut être appelé comme une méthode. La fonction intégrée "callable()" vous permet de savoir si quelque chose semble être appelable, tout comme la vérification pour une appel de la propriété. Les fonctions sont disponibles comme le sont les classes, les instances de classe peut être appelée. Voir plus sur ce ici et ici.
En Python un callable est un objet qui a une
__call__
méthode:Aussi simple que ça 🙂
Bien sûr, cela peut être surchargé:
C'est quelque chose que vous pouvez mettre "(args)" après et espérer qu'il fonctionne. Un callable est généralement une méthode ou d'une classe. Les méthodes appelées, les classes d'obtenir instancié.
callables mettre en œuvre les
__call__
méthode spéciale de sorte que tout objet avec une telle méthode est appelable.__call__
ne sera pas exigible si la classe n'est pas de définir une telle méthode.À vérifier en fonction ou une méthode de classe est remboursable ou non cela signifie que nous pouvons appeler cette fonction.
callable(obj.__init___)
ne dispose pas d'un supplément de trait de soulignement (comme dans AttributeError)? Si ça ne marche pas, êtes-vous sûr que la réponse n'est pasTrue
pour que celui-ci?Appelable est un type ou une catégorie de "Construire-dans la fonction ou de la Méthode" avec une méthode
appel
Exemple:
impression est un objet appelable. Avec construire-dans la fonction __appel__
Lorsque vous appelez le impression fonction, Python crée un objet de type d'impression et appelle sa méthode __appel__ en passant les paramètres le cas échéant.
Merci.
En ce qui concerne,
Maris
print
fonction, Python crée un objet de type d'impression et appelle sa méthode__call__
". Python ne pas créer une impression à l'objet. Il appelle simplement quelque chose d'équivalent àtype(print).__call__(print, *args, **kwargs)
. Et à la première phrase n'a pas beaucoup de sens. Vous semble être la confusion de l'objet appelable et "callable" de la fonction.