isinstance 用于检查某物是否说它是鸭子,无论它是否是鸭子。
要回答您的直接问题, isinstance.tee 是一种方法,而不是类,或者类型或类型的元组:
>>> type(itertools.tee)
<class 'builtin_function_or_method'>
(事实上,在我的 python 版本中,类已完全从选项列表中删除)。Python 是一种“鸭子类型”语言。基本上,为了让“isinstance”说某物是另一物的实例,它必须以某种方式从它继承。
例子:
>>> 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)方法定义。可以使用 dir(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!")