Skip to content

Add @override built-in #570

@evhub

Description

@evhub

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>")

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions