import functools
import inspect
class OverrideException(Exception):
pass
def override(method):
def wrapper(self,*args,**kwargs):
base = inspect.getmro(type(self))[1]
if not hasattr(base, method.__name__):
raise OverrideException('Base class "{0}" do not have method "{1}"'.format(base.__name__,method.__name__))
return method(self,*args,**kwargs)
return wrapper
class Base:
def __init__(self):
pass
# virtual
def test(self):
print("Base.test()")
class Derived(Base):
def __init__(self):
super().__init__()
@override
def test(self):
print("Derived.test()")
@override
def test2(self):
print("Derived.test2()")
def main():
d = Derived()
d.test()
d.test2()
if __name__=='__main__':
try:
main()
except Exception as e:
print(e)
aW1wb3J0IGZ1bmN0b29scwppbXBvcnQgaW5zcGVjdAoKY2xhc3MgT3ZlcnJpZGVFeGNlcHRpb24oRXhjZXB0aW9uKToKICAgcGFzcwoKZGVmIG92ZXJyaWRlKG1ldGhvZCk6CiAgIGRlZiB3cmFwcGVyKHNlbGYsKmFyZ3MsKiprd2FyZ3MpOiAgICAKICAgICAgYmFzZSA9IGluc3BlY3QuZ2V0bXJvKHR5cGUoc2VsZikpWzFdICAgICAgICAgICAKICAgICAgaWYgbm90IGhhc2F0dHIoYmFzZSwgbWV0aG9kLl9fbmFtZV9fKToKICAgICAgICByYWlzZSBPdmVycmlkZUV4Y2VwdGlvbignQmFzZSBjbGFzcyAiezB9IiBkbyBub3QgaGF2ZSBtZXRob2QgInsxfSInLmZvcm1hdChiYXNlLl9fbmFtZV9fLG1ldGhvZC5fX25hbWVfXykpCiAgICAgIHJldHVybiBtZXRob2Qoc2VsZiwqYXJncywqKmt3YXJncykgCiAgIHJldHVybiB3cmFwcGVyICAKCgpjbGFzcyBCYXNlOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgcGFzcwogICAgICAgCiAgICAjIHZpcnR1YWwgCiAgICBkZWYgdGVzdChzZWxmKToKICAgICAgIHByaW50KCJCYXNlLnRlc3QoKSIpICAgIAogICAgIAogICAgIApjbGFzcyBEZXJpdmVkKEJhc2UpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAKICAgIEBvdmVycmlkZSAKICAgIGRlZiB0ZXN0KHNlbGYpOgogICAgICAgcHJpbnQoIkRlcml2ZWQudGVzdCgpIikgICAgCiAgICAgCiAgICBAb3ZlcnJpZGUgCiAgICBkZWYgdGVzdDIoc2VsZik6CiAgICAgICBwcmludCgiRGVyaXZlZC50ZXN0MigpIikgICAgCgogICAgIApkZWYgbWFpbigpOiAgCiAgICAgZCA9IERlcml2ZWQoKQogICAgIGQudGVzdCgpCiAgICAgZC50ZXN0MigpCiAgICAKICAgICAgICAKaWYgX19uYW1lX189PSdfX21haW5fXyc6CiAgdHJ5OgogICAgIG1haW4oKQogIGV4Y2VwdCBFeGNlcHRpb24gYXMgZTogICAKICAgICBwcmludChlKQogICAgIA==