-
-
Notifications
You must be signed in to change notification settings - Fork 131
Closed
Description
Used to enforce that a subclass method is overwriting some parent class method.
Example implementation:
import sys
import types
import traceback
class override(object):
def __init__(self, func):
self.func = func
def __get__(self, obj, objtype=None):
return types.MethodType(self.func, obj, objtype)
def __set__(self, obj, val):
self.func = val
def __set_name__(self, obj, name):
if not hasattr(super(obj, obj), name):
raise RuntimeError(obj.__name__ + "." + name + " marked as override but not overriding anything")
def check_overrides(cls):
if sys.version_info < (3, 6):
for k, v in vars(cls).items():
if isinstance(v, override):
v.__set_name__(cls, k)
if __name__ == "__main__":
class A(object): pass
check_overrides(A)
try:
class B(A):
@override
def f(self): pass
check_overrides(B)
except RuntimeError:
traceback.print_exc()
else:
assert False
class C(object):
def f(self): pass
check_overrides(C)
class D(C):
@override
def f(self):
return self
check_overrides(D)
d = D()
assert d.f() is d
def new_f(self):
return 1
d.f = new_f
assert d.f() == 1
print("<success>")