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