Python面向对象 | isinstance和issubclass

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

 

 

你可能感兴趣的:(Python面向对象 | isinstance和issubclass)