class instanceable_classmethod(classmethod):
def __init__(self, func):
super().__init__(func)
self.instance_func = self.__func__
def instancemethod(self, func):
self.instance_func = func
return self
def __get__(self, obj, cls=None):
if obj is None:
return super().__get__(obj, cls)
return self.instance_func.__get__(obj)
class Foo(object):
def __init__(self, text):
self.text = text
@instanceable_classmethod
def bar(cls):
return None
@bar.instancemethod
def bar(self):
return self.text
print(Foo.bar()) # outputs None
foo = Foo('foo')
print(foo.bar()) # outputs foo
Y2xhc3MgaW5zdGFuY2VhYmxlX2NsYXNzbWV0aG9kKGNsYXNzbWV0aG9kKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmdW5jKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKGZ1bmMpCiAgICAgICAgc2VsZi5pbnN0YW5jZV9mdW5jID0gc2VsZi5fX2Z1bmNfXwoKICAgIGRlZiBpbnN0YW5jZW1ldGhvZChzZWxmLCBmdW5jKToKICAgICAgICBzZWxmLmluc3RhbmNlX2Z1bmMgPSBmdW5jCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19nZXRfXyhzZWxmLCBvYmosIGNscz1Ob25lKToKICAgICAgICBpZiBvYmogaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKCkuX19nZXRfXyhvYmosIGNscykKICAgICAgICByZXR1cm4gc2VsZi5pbnN0YW5jZV9mdW5jLl9fZ2V0X18ob2JqKQoKCmNsYXNzIEZvbyhvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRleHQpOgogICAgICAgIHNlbGYudGV4dCA9IHRleHQKCiAgICBAaW5zdGFuY2VhYmxlX2NsYXNzbWV0aG9kCiAgICBkZWYgYmFyKGNscyk6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBAYmFyLmluc3RhbmNlbWV0aG9kCiAgICBkZWYgYmFyKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnRleHQKCnByaW50KEZvby5iYXIoKSkgICMgb3V0cHV0cyBOb25lCmZvbyA9IEZvbygnZm9vJykKcHJpbnQoZm9vLmJhcigpKSAgIyBvdXRwdXRzIGZvbw==