Проверка, является ли A суперклассом B в Python

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

Итак, p2 является подклассом p1. Есть ли способ узнать программно, что p1 является [одним из] суперкласса [ов] p2?


person Andz    schedule 21.12.2009    source источник


Ответы (4)


Да, есть способ. Вы можете использовать функцию issubclass.

Следующее:

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

issubclass(p2, p1)
person Serge    schedule 21.12.2009
comment
Внимание: issubclass(A, A) оценивается как True. Это может быть не интуитивно понятно. По крайней мере, мне кажется очевидным, что класс не является своим собственным подклассом. issubclass надо было звать istypeofclass. - person ilmiacs; 09.01.2013
comment
@limiacs, меня, кто считает классы set, это не беспокоит. А является подмножеством А. - person Vineet Menon; 13.03.2015
comment
@VineetMenon правда, это, скорее всего, причина, но языки программирования предназначены не только для математиков, и большинству людей определенно не интуитивно думать, что класс является подклассом самого себя. - person ; 04.09.2018
comment
как оценить истинность только в том случае, если подкласс, но не сам? см. первый комментарий - person qrtLs; 09.01.2019

использование ‹class›.__bases__ похоже на то, что вы ищете...

>>> class p1(object): pass
>>> class p2(p1): pass
>>> p2.__bases__
(<class '__main__.p1'>,)
person user235859    schedule 21.12.2009
comment
@nikow, верно ... но проблема с issubclass () заключается в том, что он требует указания класса для сравнения, тогда как __ bases __ просто даст вам суперкласс (ы). Оба решения могут быть полезны в зависимости от обстоятельств. - person Andz; 02.06.2012
comment
На мой вопрос issubclass() был лучшим ответом, но этот ответ также приветствуется. - person Andz; 02.06.2012
comment
__bases__ даст вам только прямых родителей (те, что в скобках определения класса), в то время как issubclass проверяет всю цепочку наследования. - person wuerg; 15.04.2013

В зависимости от того, что вы пытаетесь сделать, метод «mro» также может быть полезен.

person Azeem.Butt    schedule 21.12.2009

Я думаю, вы хотели использовать "класс" вместо "деф".. :) В любом случае, попробуйте p2.__bases__

person Joril    schedule 21.12.2009