python - 重载类的所有方法的简单方法

标签 python

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

假设我编写了一个新类 Foo,它构造了一个对象,该对象用作现有类 Bar 的输入参数。 Foo 旨在向 Bar 添加一些功能,但我不希望它干扰我已经运行的任何现有作业。例如。我要非常小心,不要影响任何使用 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

等等?

最佳答案

最简单的方法可能是覆盖__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.

关于python - 重载类的所有方法的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40771329/

相关文章:

python - 循环将列表拆分为不同的子列表

python - 将 ModelMultipleChoiceField 的查询集动态设置为自定义记录集

Python,如何将进度条链接到 distutils.dir_util.copy_tree

python - 如何对 Pandas 中的多列进行求和或计数

python - 在python中反转字符串

python - 使用滚动总和根据启动/停止数据来识别某些事件

python程序运行几天就死机

python - 使用 Python 完全清除终端窗口

python - 用户文件夹 VBA 引用位置(对于 xlwings)

python - _tkinter.TclError : image "..." doesn't exist