On Fri, Sep 10, 2021 at 12:28 AM Randolf Scholz
<[email protected]> wrote:
>
> Hey,
>
> I noticed that writing a class with a classmethod `__eq__`, it does not work
> as expected:
>
> ```python
> class ANY:
> @classmethod
> def __eq__(cls, other):
> return True
>
> assert ANY == 2 # succeeds
> assert ANY == 2 # fails
> ```
>
> This is, to my understanding, because `ANY == 2` translates into
> `type(ANY).__eq__(2)`.
> However, I think it would be useful to allow user implementation of
> `classmethod` dunder methods that work as expected, or at least put a big
> disclaimer in the documentation. I am not sure how difficult this would be to
> do, but I imagine that `type` could check if the given object/class has a
> classmethod __eq__ and if so use it as a replacement for `type(obj).__eq__`
>
Yeah, a classmethod doesn't work like that. What you want is a
metaclass, which allows you to change the class of the class itself:
class AnyMeta(type):
def __eq__(self, other):
return True
class ANY(metaclass=AnyMeta): pass
assert ANY == 2
Although at this point, you probably don't want a metaclass at all, as
an instance will suffice:
class AnyType:
def __eq__(self, other):
return True
ANY = AnyType()
del AnyType # optional
assert ANY == 2
Under what circumstances do you actually want the same handler for
both the class and its instances? Seems unusual. But if you do, a
metaclass will let you do exactly that.
ChrisA
_______________________________________________
Python-ideas mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at
https://mail.python.org/archives/list/[email protected]/message/IOFMLYGQPXHUNNBQSU2QOA5ZBSYWU3JC/
Code of Conduct: http://python.org/psf/codeofconduct/