有些不切实际的假设情况,但是:
假设我有一个新的类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
等?
答案 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