轻松超载所有类的方法

时间:2016-11-23 17:58:57

标签: python

有些不切实际的假设情况,但是:

假设我有一个新的类Foo,我编写了一个构造一个对象的对象,该对象用作现有类Bar的输入参数。 Foo旨在为Bar添加一些功能,但我不希望它干扰我已经运行的任何现有作业。例如。我想要非常小心,我不会影响使用Bar的任何现有作业,因为现有作业写入的数据应该是连续/一致的。

让我们说无论出于何种原因,我都无法为foo=None的构造函数添加一个kwarg Bar。或者我可以,但这将是一个巨大的麻烦。我想要做的是给它一个Foo的实例,什么都不做。

是否有一种非常直接的方式来重载Foo的所有方法,以便它们什么都不做?或者我会被迫编写每个方法,如

class DummyFoo(Foo):
    def __init__(*args, **kwargs):
        pass

    def method1(*args, **kwargs):
        pass

    def method2(*args, **kwargs):
        pass

等?

2 个答案:

答案 0 :(得分:3)

最简单的方法可能是覆盖__getatrribute__

class Foo:
    blar = 1
    def bar(self):
        print("It's a bar! Scary Bar!")


class DummyFoo(Foo):
    def __getattribute__(self, item):
        if callable(getattr(super(), item)):
            return lambda *args, **kwargs : None
        return None


dummy_foo = DummyFoo()
dummy_foo.bar()  # Should do nothing.
print(dummy_foo.blar)

注意,这将解决任何属性,而不仅仅是Foo上的属性。如果您只需要限制属于Foo的属性,则可以执行以下操作:

class Foo:
    blar = 1

    def bar(self):
        print("It's a bar! Scary Bar!")


class DummyFoo(Foo):
    def __getattribute__(self, item):
        if item not in super().__dict__:
            raise AttributeError
        if callable(getattr(super(), item)):
            return lambda *args, **kwargs: None
        return None


dummy_foo = DummyFoo()
print(dummy_foo.bing())  # Raises an AttributeError.

答案 1 :(得分:0)

为了扩展Morgan Thrapp的答案,没有继承就可以更容易地做到这一点。

class DummyFoo:

    def __getattr__(self, name):
        '''Raises AttributeError for anything not in Foo.'''
        item = getattr(Foo, name)
        if callable(item):
            return lambda *args, **kwargs: None
        return item