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

Python 仅当子类重写某些基类方法时引发?,python,inheritance,Python,Inheritance,我知道当子类无法重写某个方法时,我可以在基类中实现一些函数 def some_method( self ): raise NotImplementedError 但是,我如何才能做相反的事情,即仅当子类重写此方法时,才会引发 谢谢 编辑:我试图阻止人们重写getitem/getattr,因此名称空间冲突不适用于此处 编辑:我已经尝试检查子类方法是否是基类方法。这在CPython下有效,但不是PyPy。是否有全面的解决方案?您可以检查该方法是否与超类的方法对象相同: def is_base_

我知道当子类无法重写某个方法时,我可以在基类中实现一些函数

def some_method( self ):
  raise NotImplementedError
但是,我如何才能做相反的事情,即仅当子类重写此方法时,才会引发

谢谢

编辑:我试图阻止人们重写getitem/getattr,因此名称空间冲突不适用于此处


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

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

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

当然,这只检测到无意的覆盖;如果一个子类决定这样做,它们可以只使用monkey patch
BaseClass

\uuuu init\uuuu()
时间,您可以使用它来了解一些方法()的详细信息。然后,您可以根据需要选择测试方法的行为或对其进行报告。

解决此问题的一种方法是使用一个元类,然后在创建过程中检查该方法是否属于
主体
,并引发
类型错误

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'

你想阻止什么?您是否应该改用双下划线约定?可能重复我试图阻止覆盖的
\uuuuu getitem\uuuu/\uuuu getattr\uuuu
为什么?实现这些的子类有什么问题吗?在基类中,我已经重写了它们以实现一些魔力,它们不应该被子类重写。这是我与CPython一起工作过的,但不是PyPy。。。但无论如何,谢谢你的帮助!如果出现JIT,则所有下注都将取消。你应该把这些相关信息放在你的问题的第一位:你已经尝试过这个和你正在使用的平台。老实说,如果这个答案没有真正回答你的问题,你就不应该接受这个答案。真不敢相信这是你想要的。。。所以你认为那些不知道如何正确使用lib的人足够聪明,可以使用这个函数来检查他们是否做得不对?嗯,你只需要相信他们或者写一份格式良好的文件。谢谢你的建议。已经更新了问题。我想这只是因为我做了错事,可能会有一个全面的解决方案。