isinstance python

В каких случаях нужно использовать isinstance в Python? Утиная типизация все спишет в функциях и методах, или есть конкретные моменты?


Ответы (1 шт):

Автор решения: Dmitry

Думаю, что ответ можно найти в анналах документации по Python. В действительности данная функциональность редко встречается в пользовательских классах. Но есть одно хорошее НО: если вы это не используете, это совершенно не значит, что это никому не нужно.

Приведу перевод из Programming FAQ официальной документации.

How do I check if an object is an instance of a given class or of a subclass of it?

Перевод: как мне проверить, является ли объект экземпляром данного класса или его подкласса

Use the built-in function isinstance(obj, cls).

Перевод: Используйте встроенную функцию isinstance(obj, cls)

Вот такой ответ. Сомневаться в нужности той или иной конструкции не приходится, пока не появляются примеры и практика их использования, так называемые best practices. Если вам нужно проверить, является ли объект экземпляром данного класса или его подкласса, тогда используйте. Лаконично.

Далее по тексту документации встречается такая оговорка, которая уточняет ОО стиль

If you are developing the classes yourself, a more proper object-oriented style is to define methods on the classes that encapsulate a particular behaviour, instead of checking the object’s class and doing a different thing based on what class it is

Перевод Если вы разрабатываете собственные классы, то более правильным объектно-ориентированным стилем будет определение методов класса, которые инкапсулируют конкретное поведение, вместо того, чтобы проверять объект класса и выполнять различные действия в зависимости от того, какой это класс

Пример, вместо вот такого использования:

def search(obj):
    if isinstance(obj, Mailbox):
        ...  # code to search a mailbox
    elif isinstance(obj, Document):
        ...  # code to search a document
    elif ..

Делай так

class Mailbox:
    def search(self):
        ...  # code to search a mailbox

class Document:
    def search(self):
        ...  # code to search a document

obj.search()
→ Ссылка