You bypass the handle protocol and you have a method of an unrelated class.
The solution is to call the protocol if __get__method exists :
if hasattr(a, '__get__'):
a = a.__get__(None, NothingSpecial)
a()
class , :
>>> a.__get__(None, NothingSpecial)
<bound method NothingSpecial.meth of <class '__main__.NothingSpecial'>>
>>> a.__get__(None, NothingSpecial)()
hi!
__getattribute__, , ; object.__getattribute__, type.__getattribute__:
>>> type.__getattribute__(NothingSpecial, 'meth')
<bound method NothingSpecial.meth of <class '__main__.NothingSpecial'>>
type(NothingSpecial).__getattribute__, __getattribute__ .