<p>谢谢@njzk2提供的解决方案。在我的代码中,我使用了<code>|</code>和<code>&</code>。为了向后兼容,我还保留了<code>.match()</code>而不是使用<code>__call__()</code>,并再次添加了<code>__add__</code></p>
<pre><code>class Filter:
def __init__(self, filter: Callable[[Any], bool]):
self.filter = filter
def __or__(self, ored: Filter):
return OrFilter(self, ored)
def __and__(self, anded: Filter):
return AndFilter(self, anded)
def __add__(self, added: Filter):
# self as __and__
return self.__and__(added)
def __invert__(self):
return Filter(lambda x: not self.filter(x))
def match(self, entry):
return self.filter(entry)
class AndFilter(Filter):
def __init__(self, left: Filter, right: Filter):
self.left = left
self.right = right
def filter(self, entry):
return self.left.filter(entry) and self.right.filter(entry)
class OrFilter(Filter):
def __init__(self, left: Filter, right: Filter):
self.left = left
self.right = right
def filter(self, entry):
return self.left.filter(entry) or self.right.filter(entry)
class MyFilter(Filter):
def __init__(self, args):
...
def ffunc(entry) -> bool:
...
super().__init__(ffunc)
</code></pre>