python基类如何判断子类是否重写了其方法?

python基类如何判断子类是否重写了其方法?,python,Python,以下是我的猜测,但这不起作用: class BaseClass(object): def foo(self): return 'foo' def bar(self): return 'bar' def methods_implemented(self): """This doesn't work...""" overriden = [] for method in ('foo', 'bar')

以下是我的猜测,但这不起作用:

class BaseClass(object):
    def foo(self):
        return 'foo'
    def bar(self):
        return 'bar'
    def methods_implemented(self):
        """This doesn't work..."""
        overriden = []
        for method in ('foo', 'bar'):
            this_method = getattr(self, method)
            base_method = getattr(BaseClass, method)
            if this_method is not base_method:
                overriden.append(method)
        return overriden

class SubClass(BaseClass):
    def foo(self):
        return 'override foo'

o = SubClass()
o.methods_implemented()
理想情况下,方法_implemented()将返回['foo']

怎么做

(为什么我要这样做?我的基类是一个HTTP资源类,它有GET、POST等方法。默认情况下,它们返回405个未实现的方法。它还有一个方法选项,该选项应返回200个响应,并将头Allow设置为任何子类实现的方法。)

可能是这样吗

>>> class BaseClass(object):
...     def foo(self):
...         return 'foo'
...     def bar(self):
...         return 'bar'
...     def methods_implemented(self):
...         """This does work."""
...         overriden = []
...         for method in ('foo', 'bar'):
...             this_method = getattr(self, method)
...             base_method = getattr(BaseClass, method)
...             if this_method.__func__ is not base_method.__func__:
...                 overriden.append(method)
...         return overriden
... 
>>> class SubClass(BaseClass):
...     def foo(self):
...         return 'override foo'
... 
>>> o = SubClass()
>>> o.methods_implemented()
['foo']
这将检查绑定方法后面的函数对象是否相同


注意,在Python2.6之前,
\uuu func\uu
属性被命名为
im\u func

方法,即使调用相同的对象,也不是相同的对象。您必须进行测试,以查看unbound方法中包装的函数是否是相同的对象

我在这里使用的是2.6,所以我还将类更改为继承自对象

>>> class BaseClass(object):
...     def foo(self):
...         return 'foo'
...     def bar(self):
...         return 'bar'
...     def methods_implemented(self):
...         """This doesn't work..."""
...         overriden = []
...         for method in ('foo', 'bar'):
...             this_method = getattr(self, method).__func__
...             base_method = getattr(BaseClass, method).__func__
...             if this_method is base_method:
...                 overriden.append(method)
...         return overriden
... 
>>> class SubClass(BaseClass):
...     def foo(self):
...         return 'override foo'
... 
>>> o = SubClass()
>>> o.methods_implemented()
['bar']

为什么这是一个社区维基?不知道你为什么要这样做。在任何类层次结构中,基类都不需要了解任何有关派生类的信息。如果这是必要的,也许你的设计需要重新思考。我同意这不应该是维基:会有一个可行的答案,可以接受。另外,我很想听到更多关于为什么要这样做的信息,不是因为你不应该这样做,而是因为这听起来像是一个问题的解决方案,在其他地方有一个更好、非常不同的解决方案。嗯,不是答案,但我想应该是“…如果这个方法不是基方法…”HTTPResource类,从哪里来?我在python中找不到任何这样的beast。这是可行的,但在我的python-2.5解释器中,您需要检查im_func,而不是func。也许你可以在回答中提到这一点。谢谢,欢迎你,不过下次你可以考虑不要把这样的问题标注为<代码>社区wiki < /代码>。响应者喜欢得到他们的分数!python3的修复:因为
base\u方法
未绑定到对象实例,因此如果此方法为
,则需要将测试调整为
。\uuuuu func\uuuuu不是base\u方法:
(删除第二个
\uu func\uuu
)。