Python 重载类的所有方法的简单方法

Python 重载类的所有方法的简单方法,python,Python,有些不现实的假设情况,但: 假设我编写了一个新类Foo,它构造了一个对象,用作现有类Bar的输入参数Foo旨在向Bar添加一些功能,但我不希望它干扰任何已运行的现有作业。例如,我要非常小心,不要影响任何使用条形码的现有作业,因为现有作业写入的数据应该是连续/一致的 比如说,无论出于何种原因,我都无法将kwargfoo=None添加到Bar的构造函数中。或者我可以,但这将是一个巨大的麻烦。我想做的是给它一个不做任何事情的Foo实例 有没有一种真正直接的方法来重载Foo的所有方法,使它们什么都不做?

有些不现实的假设情况,但:

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

比如说,无论出于何种原因,我都无法将kwarg
foo=None
添加到
Bar
的构造函数中。或者我可以,但这将是一个巨大的麻烦。我想做的是给它一个不做任何事情的
Foo
实例

有没有一种真正直接的方法来重载
Foo
的所有方法,使它们什么都不做?或者我会被迫像这样编写每个方法吗

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

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

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

etc?

最简单的方法可能是重写
\uuu getatribute\uuu

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.

要扩展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

看起来你违反了替代原则,不是吗?在大多数情况下,很可能。在我提出这个问题的情况下,我不会。你只需要函数吗?或者对所有实例/类属性也是如此?人们必须问,如果只是清除所有方法,为什么需要继承任何东西?此外,子类不会影响父类实例的行为,除非您正在操作类变量。@Morgan Thrapp问得好。在这种情况下,我认为它只适用于函数。为了完整性,lambda应该是
lambda*args,**kwargs:None
-可以使用关键字参数调用方法。@ukaszRogalski您完全正确。我只是把它添加到我的答案中,谢谢你指出它!