也许我的设计完全不对劲,但如果我有两个可比较的派生类对象,但类D1基本上总是大于类D2。(比方说,将常春藤之桥与286相比)。我如何在不使用isinstance(D2)的情况下实现类d1的比较来反映这一点?
我看到了这个:Comparing two objects和If duck-typing in Python, should you test isinstance?
我可以添加一个"type“属性,然后对类型进行比较,但最后我也可以使用isinstance。最简单的方法是使用isinstance...有什么更好的建议吗?
发布于 2012-07-14 11:57:48
我会问自己:“是什么让D2总是比D1更伟大?”换句话说,它们是否有一些共同的属性,基于这些属性进行比较是有意义的。如果这个问题没有很好的答案,那么可能值得问一问,为这两个对象创建比较是否真的有意义。
如果在考虑了这些事情之后,您仍然认为进行比较是一个好主意,那么就使用isinstance。它仍然存在于语言中是有原因的-- python不断地弃用被认为是坏做法的东西,这意味着isinstance并不总是一件坏事。
问题是当isinstance被用来做不必要的类型检查时。换句话说,用户经常在“三思而后行”的情况下使用它,这是完全不必要的。
if not isinstance(arg,Foo):
raise ValueError("I want a Foo")在这种情况下,如果用户没有将看起来足够像Foo的东西放到函数中,它无论如何都会引发异常。为什么要将其限制为仅限Foo对象?然而,在您的例子中,似乎从概念的角度来看,对象的类型实际上很重要。这就是isinstance存在的原因(在我看来)。
发布于 2012-07-14 11:57:41
我会这样做:
class D1(object):
def __val_cmp(self, other):
# compare by attributes here
if self.attr < other.attr:
return -1
elif self.attr > other.attr:
return 1
return 0
def __cmp__(self, other):
greater = isinstance(other, type(self))
lesser = isinstance(self, type(other))
if greater and lesser:
# same type so compare by attributes
return self.__val_cmp(other)
elif greater:
return 1
elif lesser:
return -1
else:
# other type is not a parent or child type, so just compare by attributes
return self.__val_cmp(other)进行比较
https://stackoverflow.com/questions/11480746
复制相似问题