python用duck类型比较两个相似的对象

2024-05-14 21:44:44 发布

您现在位置:Python中文网/ 问答频道 /正文

也许我的设计完全不正常,但是如果我有两个可比较的派生类对象,但是类D1基本上总是>;类D2。(比如把常春藤桥和286相比)。如果不使用isinstance(D2),我如何实现类D1的比较来反映这一点呢?在

我看到了这个: Comparing two objectsIf duck-typing in Python, should you test isinstance?

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


Tags: 对象ingtyoutypingifobjectsisinstance
2条回答

我会这样做:

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的实例与未知类的实例进行比较,则将按类的属性进行比较

我会问自己“D2是什么让它总是大于D1?”换言之,它们是否有一些共同的属性,作为比较的基础。如果这个问题没有一个好的答案,那么也许有必要问一下,为这两个对象创建比较是否有意义。在

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

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

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

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

相关问题 更多 >

    热门问题