isinstance используется, чтобы проверить, что-то говорит, что это утка, независимо от того, является она утка или нет.
Чтобы ответить на ваш вопрос сразу же, isinstance.tee является методом, а не класс или типа или кортежа типов:
>>> type(itertools.tee)
<class 'builtin_function_or_method'>
(На самом деле, на мою версию питона, класс вообще был удален из списка вариантов). Python - это «язык, уложенный языком». В принципе, для того, чтобы «isststance» сказать, что что-то является примером другого, оно должно каким-то образом унаследовать его.
Пример:
>>> type(str)
<class 'type'>
>>> s = "foo"
>>> isinstance(s,str)
True
>>> class myString(str): #myString inherits from str (a type)
... def __init__(self,s):
... super().__init__()
...
>>> s = myString("foo")
>>> s
'foo'
>>> isinstance(s,str)
True
В первую очередь, эти базовые классы, которые должны быть наследственные типы (там, где это возможно) базовые или абстрактные базовые классы. Почему это?Ну, разработчики Python хотят избежать ситуации, когда у нас есть миллион новых пользовательских типов, таких как FooString и BarInt, которые люди начинают проверять, например. Этого следует избегать.
ABC предоставляет способ позволить объекту сказать, что это что-то вроде Integral или String, без (обязательно) должно быть строкой.
Но утиная печать на языке Python основана на реализации протоколов. Протоколы определяются одним или несколькими «специальными» (или магическими или dunder) методами в классе. Определение того, какие специальные методы являются частью класса может быть сделано с дир (myObj):
>>> dir(itertools.tee)
['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__text_signature__']
Или, еще лучше, если это возможно, попробуйте сделать что-то с ним, и если это не удается, вы знаете, что это не утка:
try: duck(something)
except: print("Not a duck!")
ой есть путь, я думаю: P +1 –