isinstance(a,b):判断a是否是b类(或者b类的基类)实例化的对象
class A: pass class B(A): pass obj = B() print(isinstance(obj,B)) # True print(isinstance(obj,A)) # True
issubclass(a,b): 判断a类是否是b类(或者b的基类)的派生类
class A: pass class B(A): pass class C(B): pass print(issubclass(B,A)) # True print(issubclass(C,A)) # True # issubclass(子类名,父类名) 如果返回True,说明有继承关系
思考:那么 list str tuple dict等这些类与 Iterble类 的关系是什么?
from collections.abc import Iterable print(isinstance([1,2,3], list)) # True print(isinstance([1,2,3], Iterable)) # True print(issubclass(list,Iterable)) # True # 由上面的例子可得,这些可迭代的数据类型,list str tuple dict等 都是 Iterable的子类。
isinstance() 与 type() 区别:
-
type() 不会认为子类是一种父类类型,不考虑继承关系。
-
isinstance() 会认为子类是一种父类类型,考虑继承关系。
如果要判断两个类型是否相同推荐使用 isinstance()
a = 2 print(isinstance (a,int)) # 判断是否为整形 True
判断继承关系
class A:pass class B:pass class A(B):pass a = A() print(isinstance(a,A)) print(isinstance(a,B)) # 能够检测到继承关系 print(type(a) is A) print(type(a) is B) # type 只单纯的判断类型 ''' 执行输出: True True True False '''
isinstance判断一个对象和一个类有没有血缘关系. 这2个方法,不常用
内置的东西,都和内置的方法有着千丝万缕的联系
当一个对象拥有__len__方法时,就可以使用len()方法时。
想要__len__有实际意义,统计属性的个数
class A: def __init__(self,name,age,sex,cls): self.name = name self.age = age self.sex = sex self.cls = cls def __len__(self): # 添加__len__方法 return len(self.__dict__) # 通过__dict__方法,可以查看对象的属性 a1 = A('Tony',81,'不详',2) a1.hobby = '理发' a2 = A('John',20,'不详',3) a3 = A('Linda',21,'不详',4) print(len(a1)) print(len(a2)) print(len(a3)) ''' 执行输出: 5 4 4 '''
一个对象,能不能hash, 靠一个内置方法__hash__决定的
class A: def __init__(self,name,age,sex,cls): self.name = name self.age = age self.sex = sex self.cls = cls a = A('Tony', 81, '男', 2) print(hash(a)) # -9223371925907897960
a对象之所以可以hash,是靠object类来完成的。由于python3所有类都继承了object类
可以自己定义个__hash__方法
class A: def __init__(self,name,age,sex,cls): self.name = name self.age = age self.sex = sex self.cls = cls def __hash__(self): return 0 a1 = A('Tony',81,'男',2) print(hash(a1)) # 0