Daniel Urban <[email protected]> added the comment:
> class Meta(ABCMeta):
> def __instancecheck__(cls, instance):
> # monkeypatching class method
> cls.__subclasscheck__ = super(Meta, cls).__subclasscheck__
This line is approximately the same as:
cls.__dict__['__subclasscheck__'] = ...
So it will put the object in the namespace of cls. The function in the
namespace of type(cls) will remain there. (Also, the object you put in there is
a bound method, so this is probably not what you want.)
> return super(Meta, cls).__instancecheck__(instance)
>
> def __subclasscheck__(cls, sub):
> return cls in sub.mro()
>
> class A(object):
> __metaclass__ = Meta
>
> class B(object): pass
>
> # registering class 'B' as a virtual subclass of 'A'
> A.register(B)
>
> >>> issubclass(B, A)
> False
> >>> isinstance(B(), A) # => method __subclasscheck__ is now
> monkeypatched
A.__dict__['__subclasscheck__'] is now indeed the other method you put in
there, but issubclass will call type(A).__dict__['__subclasscheck__'] which
remain the same. (Because __special__ methods a looked up directly in the
namespace of the type of an object, see
http://docs.python.org/dev/py3k/reference/datamodel#special-lookup).
----------
_______________________________________
Python tracker <[email protected]>
<http://bugs.python.org/issue13264>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com