[Python-3000] Why isinstance() and issubclass() don't need to be unforgeable
Phillip J. Eby
pje at telecommunity.com
Tue May 1 18:27:50 CEST 2007
I just wanted to throw in a note for those who are upset with the idea that
classes should be able to decide how isinstance() and issubclass()
work. If you want "true, unforgeable" isinstance and subclass, you can
still use these formulas:
def true_issubclass(C1, C2):
return C2 in type.__mro__.__get__(C1)
def isinstance_no_proxy(o, C):
return true_issubclass(type(o), C)
def isinstance_with_proxy(o, C):
cls = getattr(o, '__class__', None)
return true_issubclass(cls, C) or isinstance_no_proxy(o, C)
Their complexity reflects the fact that they rely on implementation details
which the vast majority of code should not care about.
So, if you really have a need to find out whether something is truly an
instance of something for *structural* reasons, you will still be able to
do that. Yes, it will be a pain. But deliberately inducing structural
dependencies *should* be painful, because you're making it painful for the
*users* of your code, whenever you impose isinstance/issubclass checks
beyond necessity.
The fact that it's currently *not* painful, is precisely what makes it such
a good idea to add the new hooks to make these operations forgeable.
The default, in other words, should not be to care about what objects
*are*, only what they *claim* to be.
More information about the Python-3000
mailing list