我知道我可以在基类中实现一些函数,当子类无法覆盖某些方法时引发。
def some_method( self ):
raise NotImplementedError
但是我怎么能做相反的事情,即只有当子类覆盖这个方法时才会提升?
谢谢!
编辑:我试图阻止人们覆盖 getitem / getattr ,因此命名空间冲突在此处不适用。
编辑:我已经尝试检查子类方法是否是基类方法。这在CPython下运行,但不是PyPy。有没有全面的解决方案?
答案 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()的详细信息。然后,您可以选择测试方法的行为或根据需要对其进行报告。