2010-10-22 5 views
13

J'écris une classe qui encapsule n'importe quel objet arbitraire, y compris les types simples. Je veux que le « est » mot-clé pour fonctionner sur la valeur encapsulées, telles que ce comportement:python: classe override "is" comportement

Wrapper(True) is True -> True 
Wrapper(False) is True -> False 
Wrapper(None) is None -> True 
Wrapper(1) is 1 -> True 

est-il une méthode d'objet que je peux remplacer pour obtenir ce comportement?

Répondre

24

N ° is, and et or ne peuvent pas être surchargés.

+0

Est-ce que cela existe dans la documentation Python? Je ne trouve rien qui vérifie cela. –

+4

La seule référence est leur absence au §3.4 du langref. http://docs.python.org/reference/datamodel.html#special-method-names –

+0

Cette réponse est assez ancienne. Est-ce toujours vrai pour les dernières versions de Python? –

2

Généralement, si vous voulez tester l'égalité en termes de valeur (si x vaut 1, ou True, ou None), vous utiliserez l'opérateur == de toute façon. Si vous voulez utiliser l'opérateur is, vous testez généralement si quelque chose se réfère à autre chose, comme list1 is list2.

Si vous souhaitez définir un comportement spécial pour ==, vous pouvez définir __eq__ dans votre définition de classe.

-4

n ° is, and et or ne peuvent pas être surchargées.

En effet. Je crois que les mots-clés sont réservés et ne peuvent pas être surchargés ou modifiés.

Voir: http://docs.python.org/2/reference/lexical_analysis.html#keywords

« Les identifiants suivants sont utilisés comme des mots réservés, ou les mots clés de la langue, et ne peuvent pas être utilisés comme identificateurs ordinaires. » La liste est: ['and', 'as', 'assert', 'break', 'class', 'continuer', 'def', 'del', 'elif', 'else', «except», «exec», «finally», «for», «from», «global», «if», «import», «in», «is», «lambda», «not», ou », 'passe', 'print', 'relance', 'retour', 'essayer', 'tout', 'avec', 'rendement']

Cette liste peut être consultée par la commande

keyword.kwlist

(N'oubliez pas d'importer le mot-clé en premier)

également:

keyword.iskeyword ('est')

Renvoie True


Mise à jour:

Ma réponse était mauvaise et je devrais me sentir mal.

Je me suis trompé avec moi-même. Je ne sais pas pourquoi je ne l'ai pas remarqué que ...

2ème essai:

La documentation suivante fournit une liste complète des comportements personnalisable sur les classes. Cela inclut toutes les méthodes pour surcharger et surcharger les opérateurs. 'est' n'est pas inclus.

http://docs.python.org/2/reference/datamodel.html#special-method-names

mieux que je peux faire.

+0

Mais 'del' peut être surchargé, par exemple, vous pouvez surcharger' del x [i] 'ou 'del x.attr'. La question est de savoir si la sémantique peut être modifiée, pas la syntaxe. –

+0

'in' peut être directement surchargé. 'as' peut être partiellement surchargé, dans un gestionnaire de contexte. 'import' et' for' peuvent être surchargés indirectement. –

+0

Vous devez supprimer les fausses instructions, pour la foule tldr. – bukzor