首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python将2个类似的对象与鸭子类型进行比较

python将2个类似的对象与鸭子类型进行比较
EN

Stack Overflow用户
提问于 2012-07-14 11:21:13
回答 2查看 349关注 0票数 1

也许我的设计完全不对劲,但如果我有两个可比较的派生类对象,但类D1基本上总是大于类D2。(比方说,将常春藤之桥与286相比)。我如何在不使用isinstance(D2)的情况下实现类d1的比较来反映这一点?

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

我可以添加一个"type“属性,然后对类型进行比较,但最后我也可以使用isinstance。最简单的方法是使用isinstance...有什么更好的建议吗?

EN

回答 2

Stack Overflow用户

发布于 2012-07-14 11:57:48

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

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

问题是当isinstance被用来做不必要的类型检查时。换句话说,用户经常在“三思而后行”的情况下使用它,这是完全不必要的。

代码语言:javascript
运行
复制
if not isinstance(arg,Foo): 
   raise ValueError("I want a Foo")

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

票数 2
EN

Stack Overflow用户

发布于 2012-07-14 11:57:41

我会这样做:

代码语言:javascript
运行
复制
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的实例与未知类的实例进行比较,则将按类的属性

进行比较

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11480746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档