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