Making functions non override-able

后端 未结 5 1024
我寻月下人不归
我寻月下人不归 2020-12-05 03:05

I know python functions are virtual by default. Let\'s say I have this:

class Foo:
    def __init__(self, args):
        do some stuff
    def goo():
                


        
5条回答
  •  执笔经年
    2020-12-05 03:26

    def non_overridable(f):
        f.non_overridable = True
        return f
    
    class ToughMeta(type):
        def __new__(cls, name, bases, dct):
            non_overridables = get_non_overridables(bases)
            for name in dct:
                if name in non_overridables:
                    raise Exception ("You can not override %s, it is non-overridable" % name)
            return type.__new__(cls, name, bases, dct)
    
    def get_non_overridables(bases):
        ret = []
        for source in bases:
            for name, attr in source.__dict__.items():
                if getattr(attr, "non_overridable", False):
                    ret.append(name)
            ret.extend(get_non_overridables(source.__bases__))
        return ret
    
    class ToughObject(object):
        __metaclass__ = ToughMeta
        @non_overridable
        def test1():
            pass
    
    # Tests ---------------
    class Derived(ToughObject):
        @non_overridable
        def test2(self):
            print "hello"
    
    class Derived2(Derived):
        def test1(self):
            print "derived2"
    
    # --------------------
    

提交回复
热议问题