【问题标题】:Checking if A is superclass of B in Python在 Python 中检查 A 是否是 B 的超类
【发布时间】:2023-04-05 04:35:02
【问题描述】:
class p1(object): pass
class p2(p1): pass

所以 p2 是 p1 的子类。有没有办法以编程方式找出 p1 是 p2 的超类[之一]?

【问题讨论】:

    标签: python reflection superclass


    【解决方案1】:

    我认为你的意思是使用“class”而不是“def”.. :) 不管怎样,试试p2.__bases__

    【讨论】:

      【解决方案2】:

      是的,有办法。您可以使用issubclass 函数。

      如下:

      class p1(object):pass
      class p2(p1):pass
      
      issubclass(p2, p1)
      

      【讨论】:

      • 注意:issubclass(A, A) 的计算结果为 True。这可能不直观。至少在我看来,一个类不是它自己的子类似乎很明显。 issubclass 应该被称为 istypeofclass
      • @limiacs,对于将课程视为set 的我来说,这并不困扰我。 A 是 A 的子集。
      • @VineetMenon 是的,这很可能是原因,但编程语言不仅适用于数学家,而且大多数人认为类是其自身的子类绝对不直观。
      • 如何仅在子类而非自身的情况下评估为真?查看第一条评论
      【解决方案3】:

      根据您要执行的操作,“mro”方法也很有用。

      【讨论】:

        【解决方案4】:

        使用 .__bases__ 似乎是您正在寻找的...

        >>> class p1(object): pass
        >>> class p2(p1): pass
        >>> p2.__bases__
        (<class '__main__.p1'>,)
        

        【讨论】:

        • @nikow,对...但是 issubclass() 的问题是它需要提供一个类进行比较,而 __ bases __ 只会直接给你超类。根据具体情况,这两种解决方案都可能有用。
        • 对于我的问题,issubclass() 是更好的答案,但这个答案也值得赞赏。
        • __bases__ 只会给你直接的父母(在类定义的括号中的那些),而 issubclass 检查整个继承链。
        猜你喜欢
        • 2014-05-01
        • 2013-04-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        相关资源
        最近更新 更多