2016-11-23 62 views
1

有点不切实际假设情况的所有方法,但:简单的方法重载一个类

说我有一个新的类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 

etc?

+0

看起来你会打破替代原则,不是吗? – njzk2

+0

在大多数情况下,可能。在我激发这个问题的情况下,我不会。 – Batman

+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

为了完整性,lambda应该是'lambda * args,** kwargs:None' - 可以用关键字参数调用方法。 –

+0

@ŁukaszRogalski你是完全正确的。我只是将其添加到我的答案,谢谢指出! –

0

要在摩根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