擅长:python、mysql、java
<p>我会选择这样的方式:</p>
<pre class="lang-py prettyprint-override"><code>class Filter:
def __init__(self, filter: Callable[[Any], bool]):
self.filter = filter
def __add__(self, added: Filter):
return OrFilter(self, added)
def __mul__(self, mult: Filter):
return AndFilter(self, mult)
def __invert__(self):
return Filter(lambda x: not self.filter(x))
def __call__(self, entry):
return self.filter(entry)
class AndFilter(Filter):
def __init__(self, left: Filter, right: Filter):
self.left = left
self.right = right
def __call__(self, entry):
return self.left(entry) and self.right(entry)
class OrFilter(Filter):
def __init__(self, left: Filter, right: Filter):
self.left = left
self.right = right
def __call__(self, entry):
return self.left(entry) or self.right(entry)
</code></pre>
<p>然后您可以创建过滤器,并将其用作<code>(filterA + ~filterB) * filterC</code></p>
<p>您可能希望用泛型类型替换该<code>Any</code>,以便您的过滤器知道它在处理什么</p>