Daniel Urban <urban.dani...@gmail.com> 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 <rep...@bugs.python.org>
<http://bugs.python.org/issue13264>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to