magic len getitem def commands __getitem__ __eq__ python magic-methods getattr

python - len - ¿Cuáles son los nombres de los métodos mágicos para los operadores "is" y "in"?



magic python (3)

Para in , el método de dunder correcto es __contains__ .

No hay método para is , porque es equivalente a id(a) == id(b) . Compara el ID de objeto real utilizado bajo el capó por Python, por lo que se usa para comparar la identidad del objeto, no el contenido del objeto. Sobrescribirlo dentro de una clase rompería el modelo de objetos de Python, por lo que no está permitido.

Me gustaría hacer operaciones binarias binarias usando los métodos mágicos para estos operadores. Por ejemplo, puedo obtener a < b como getattr(a, ''__lt__'')(b) o a == b como getattr(a, ''__eq__'')(b) .

¿Puedo obtener a in b y a is b de esa manera?


__contains__ es correcto para in , con opciones de retroceso si __contains__ no está definido como __iter__ y __getitem__ .

getattr embargo, no estoy muy seguro de por qué necesitarías usar getattr para; is está "definido" para cada objeto en Python. No hay necesidad de pasar por operator._is o (intentar y fallar) a través de getattr .

Consulte la documentación sobre los tipos incorporados :

El comportamiento de los operadores is y is not puede ser personalizado ; también se pueden aplicar a cualquiera de los dos objetos y nunca generar una excepción.

(Énfasis mío)

De acuerdo con los fragmentos que proporcionó, que simplemente toman una función y la llaman usando getattr(a, "function")(b) , ya tiene los nombres de los objetos que necesita evaluar, solo use de inmediato; siempre está disponible.


in es __contains__ y is que no tiene un método de dunder. Le sugiero que use las funciones en el módulo del operator :

a < b => operator.lt(a, b) a == b => operator.eq(a, b) a in b => operator.contains(a, b) a is b => operator.is_(a, b)