3

使用 Python,我正在尝试实现一组类型,包括“无关”类型,用于模糊匹配。我已经这样实现了:

class Matchable(object):        
    def __init__(self, match_type = 'DEFAULT'):
        self.match_type = match_type

    def __eq__(self, other):
        return (self.match_type == 'DONTCARE' or other.match_type == 'DONTCARE' \
or self.match_type == other.match_type)

来自 OO 背景,这个解决方案看起来不优雅;使用 Matchable 类会产生丑陋的代码。我更喜欢消除 match_type,而是让每个类型都有自己的类继承自超类,然后使用类型检查来进行比较。然而,类型检查似乎通常不被接受:

http://www.canonical.org/~kragen/isinstance/

是否有更好的(更pythonic)方法来实现这个功能?

注意:我知道关于 Python“枚举”的大量问题和答案,其中一个答案可能是合适的。重写的 __ eq __ 函数的要求使事情变得复杂,而且我还没有看到在这种情况下使用提议的枚举实现的方法。

我能想到的最好的 OO 方法是:

class Match(object):
    def __eq__(self, other):
        return isinstance(self, DontCare) or isinstance(other, DontCare) or type(self) == type(other)

class DontCare(Match):
    pass

class A(Match):
    pass

class B(Match):
    pass

d = DontCare()
a = A()
b = B()


print d == a
True
print a == d
True
print d == b
True
print a == b
False
print d == 1
True
print a == 1
False
4

2 回答 2

2

我想你只需要检查是否有任何操作数是模糊类型,不是吗?

class Fuzzy(object):
    def __eq__(*args):
        def isFuzzy(obj):
            return isinstance(obj, Fuzzy)
        return any(map(isFuzzy, args))

现在你可以这样做:

>>> class DefaultClass(object):
...    pass

>>> class DontCareClass(Fuzzy):
...    pass

>>> DefaultClass() == DontCareClass()
True

由于我们使用的是isInstance,这将适用于多态性。isInstance在我看来,这是完全合法的使用。当您只能依赖鸭子类型时,您要避免的是类型检查,但这不是其中一种情况。

编辑:实际上,出于实际目的,这也很好:

class Fuzzy(object):
    def __eq__(*args):
        return True
于 2013-04-02T22:30:24.383 回答
2

你链接的文章说这isinstance并不总是邪恶的,我认为你的情况是合适的。文章中的主要抱怨是使用isinstance检查对象是否支持特定接口减少了使用隐含接口的机会,这是一个公平的观点。但是,在您的情况下,您实际上将使用一个Dontcare类来为在比较中应如何处理对象提供注释,并且isinstance将检查这样的注释,这应该是完美的。美好的。

于 2013-04-02T22:45:49.550 回答