1

也许我的设计完全不合时宜,但如果我有 2 个可比较的派生类对象,但 D1 类基本上总是 > D2 类。(例如将 Ivy Bridge 与 286 进行比较)。如果不使用 isinstance(D2),我将如何实现 D1 类的比较以反映这一点?

我看到了这个: 比较两个对象如果在 Python 中进行鸭子类型,你应该测试 isinstance 吗?

我可以添加一个“类型”属性,然后比较类型,但我还不如使用 isinstance。最简单的方法是使用 isinstance... 有更好的建议吗?

4

2 回答 2

2

我会问自己“是什么让 D2 总是大于 D1?” 换句话说,它们是否有一些共同的属性,作为比较的基础是有意义的。如果这个问题没有好的答案,那么可能值得询问为这两个对象创建比较是否真的有意义。

如果,在考虑了这些事情之后,您仍然认为进行比较是一个好主意,那么只需使用isinstance. 它仍然存在于语言中是有原因的——python 一直在反对那些被认为是不好的做法的东西,这意味着这isinstance并不总是一件坏事。

问题是当使用 isinstance 进行不必要的类型检查时。换句话说,用户经常在完全没有必要的“先看一下”上下文中使用它。

if not isinstance(arg,Foo): 
   raise ValueError("I want a Foo")

在这种情况下,如果用户没有将看起来足够像 Foo 的东西放入函数中,它无论如何都会引发异常。为什么将其限制为仅 Foo 对象?但是,在您的情况下,从概念的角度来看,对象的类型似乎实际上很重要。这就是isinstance存在的原因(在我看来)。

于 2012-07-14T03:57:47.750 回答
1

我会做这样的事情:

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)
  • 如果 D2 是 D1 的子类型,则 D2 的实例将始终比 D1 的实例比较少。
  • 如果 D0 是 D1 的父类型,则 D0 的实例将始终比较大于 D1 的实例。
  • 如果将 D1 的一个实例与 D1 的另一个实例进行比较,则将根据类的属性进行比较。
  • 如果将 D1 的实例与未知类的实例进行比较,则比较将按类的属性进行
于 2012-07-14T03:57:40.577 回答