Допустим, у меня есть классный костюм и четыре подкласса костюма: Heart, Spade, Diamond, Club.
class Suit:
...
class Heart(Suit):
...
class Spade(Suit):
...
class Diamond(Suit):
...
class Club(Suit):
...
У меня есть метод, который получает костюм в качестве параметра, который является объектом класса, а не экземпляром. Точнее, он может получить только одно из четырех значений: Heart, Spade, Diamond, Club. Как я могу сделать утверждение, которое гарантирует такую вещь? Что-то вроде:
def my_method(suit):
assert(suit subclass of Suit)
...
Я использую Python 3.
my_method
могут быть получены в качестве параметров: «он может получить только одно из четырех значений: Heart, Spade, Diamond, Club». Эти значения являются объектами класса, а не экземплярами класса. Мне кажется, это довольно ясно, хотя я полагаю, что вы правы насчет неопределенности, потому что ответы охватывают обе возможности. Вы можете редактировать вопрос, если у вас есть более ясное слово для этого. Спасибо за комментарий._class
, делая их похожимиsuit_class
. Я предложил такое соглашение об именах в соответствующем вопросе .my_method(Heart)
my_method(Spade)
...inspect.isclass
или просто использоватьisinstance(myvar, type)
в Python 3, чтоissubclass
вызовет ошибку, если она передана не классу. Смотрите этот ответ . Я бы прокомментировал ответ ниже, но он никогда бы не увидел свет.Ответы:
Вы можете использовать
issubclass()
как этоassert issubclass(suit, Suit)
.источник
issubclass(class, classinfo)
Выдержка:
источник
Вы можете использовать,
isinstance
если у вас есть экземпляр, илиissubclass
если у вас есть класс. Обычно считается плохой идеей. Обычно в Python вы выясняете, способен ли объект на что-то, пытаясь сделать это с ним.источник
issubclass(sub, sup)
Булева функция возвращает истину , если данный подклассsub
действительно подкласс суперклассаsup
.источник
issubclass
минимальный работоспособный примерВот более полный пример с некоторыми утверждениями:
GitHub вверх по течению .
Протестировано в Python 3.5.2.
источник
Вы можете использовать встроенный класс. Но проверка типов обычно рассматривается как ненужная, потому что вы можете использовать типизацию по типу утки.
источник
Использование issubclass казалось чистым способом записи уровней журналов. Это немного странно при использовании ... но кажется чище, чем другие варианты.
источник
Согласно документации по Python , мы также можем использовать
class.__mro__
атрибут илиclass.mro()
метод:источник
источник