gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:46:46 24 4
gpt4 key购买 nike

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

假设我编写了一个新类 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com