仅当子类重写某些基类方法时才会引发?

时间:2017-12-26 01:35:52

标签: python inheritance

我知道我可以在基类中实现一些函数,当子类无法覆盖某些方法时引发

def some_method( self ):
  raise NotImplementedError

但是我怎么能做相反的事情,即只有当子类覆盖这个方法时才会提升

谢谢!

编辑:我试图阻止人们覆盖 getitem / getattr ,因此命名空间冲突在此处不适用。

编辑:我已经尝试检查子类方法是否是基类方法。这在CPython下运行,但不是PyPy。有没有全面的解决方案?

3 个答案:

答案 0 :(得分:1)

解决此问题的一种方法是使用元类,然后在创建期间检查该方法是body的一部分并引发typeError

class BaseMeta(type):
    def __new__(cls, name, bases, body):
        if 'bar' in body:
            raise TypeError("bad user class")
        return super().__new__(cls, name, bases, body)


class Base(metaclass=BaseMeta):
    def bar(self):
        return None


class Derived(object):
    def bar(self):
        return 'bar'

答案 1 :(得分:0)

您可以检查该方法是否与超类相同的方法对象:

def is_base_impl(obj):
    return obj.__getattr__ is BaseClass.__getattr__

当然,这只能检测到无意的覆盖;如果一个子类被确定为这样做,他们可能只需要修补BaseClass

答案 2 :(得分:0)

__init__()时,您可以使用inspect.getmembers()了解有关some_method()的详细信息。然后,您可以选择测试方法的行为或根据需要对其进行报告。