Digamos que eu tenho um naipe de classe e quatro subclasses de naipe: Coração, Pá, Diamante, Clube.
class Suit:
...
class Heart(Suit):
...
class Spade(Suit):
...
class Diamond(Suit):
...
class Club(Suit):
...
Eu tenho um método que recebe uma ação como parâmetro, que é um objeto de classe, não uma instância. Mais precisamente, ele pode receber apenas um dos quatro valores: Coração, Pá, Diamante, Clube. Como posso fazer uma afirmação que garanta tal coisa? Algo como:
def my_method(suit):
assert(suit subclass of Suit)
...
Estou usando o Python 3.
my_method
podem ser obtidos como parâmetros: "ele pode receber apenas um dos quatro valores: Coração, Pá, Diamante, Clube". Esses valores são objetos de classe, não instâncias de classe. Parece-me bastante claro, embora eu suponha que você esteja certo sobre a imprecisão, porque as respostas cobrem as duas possibilidades. Você pode editar a pergunta se tiver uma redação mais clara. Obrigado pelo comentário._class
, tornando-os semelhantessuit_class
. I propôs tal convenção de nomenclatura em uma questão relevante .my_method(Heart)
my_method(Spade)
...inspect.isclass
ou simplesmente usar uma condiçãoisinstance(myvar, type)
no Python 3, pois issoissubclass
gerará um erro se ela passar por uma não-classe. Veja esta resposta . Eu teria comentado a resposta abaixo, mas nunca teria visto a luz do dia.Respostas:
Você pode usar
issubclass()
assimassert issubclass(suit, Suit)
.fonte
issubclass(class, classinfo)
Excerto:
fonte
Você pode usar
isinstance
se tiver uma instância ouissubclass
se tiver uma classe. Normalmente, é uma má ideia. Normalmente, no Python, você descobre se um objeto é capaz de algo tentando fazer isso.fonte
A
issubclass(sub, sup)
função booleana retorna true se a subclasse especificadasub
for realmente uma subclasse da superclassesup
.fonte
issubclass
exemplo executável mínimoAqui está um exemplo mais completo com algumas afirmações:
GitHub upstream .
Testado em Python 3.5.2.
fonte
Você pode usar a issubclass interna. Mas a verificação de tipo geralmente é vista como desnecessária, porque você pode usar a digitação de pato.
fonte
Usar issubclass parecia uma maneira limpa de escrever níveis de log. É meio estranho usá-lo ... mas parece mais limpo do que outras opções.
fonte
De acordo com o documento Python , também podemos usar
class.__mro__
atributo ouclass.mro()
método:fonte
fonte