Python进阶之路 8.2.5 检测继承关系

版权声明:本教程只限学习交流,不得用于商业用途。 https://blog.csdn.net/weixin_45086637/article/details/90946243

8.2.5 检测继承关系

在很多场景中,需要知道一个类A是否是从另外一个类B继承,这种校验主要是为了调用B类中的成员(方法和属性)。如果B是A的父类,那么创建A类的实例肯定会拥有B类所有的成员,关键是要判断B是否为A的父类。

判断类与类之间的关系可以使用issubclass函数,该函数接收两个参数,第1个参数是子类、第2个参数是父类。如果第1个参数指定的类与第2个参数指定的类确实是继承关系,那么该函数返回True,否则返回False。

# myclass2是myclass1的父类,返回True,否则返回False
issubclass(myclass1,myclass2)

如果想要获得已知类的父类(们),可以直接使用"__bases__",这是类的一个特殊属性,bases两侧是双下划线。

print(myclass.__bases__)

执行这行代码,如果myclass类的父类是parentclass,那么会输出如下内容。

(<class '__main__.myparentclass'>,)

除了可以使用前面介绍的方法检测类本身的继承关系外,还可以使用isinstance函数检测一个对象是否是某一个对象的实例。isinstance函数有两个参数,第1个参数是要检测的对象,第2个参数是一个类。如果第1个参数指定的对象是第2个参数指定的类的实例,那么该函数返回True,否则返回False。

person = persons()
# 如果person对象是persons类的实例,返回True,否则返回False
print(isinstance(person,persons))

[例 8.5] 本例创建了4个类,其中childclass、parentclass和myparentclass三个类有继承关系,也就是说,后一个类是前一个类的父类。另外一个myclass类是一个独立的类。接下来利用这4个类来演示issubclass__bases__isinstance的用法。

# 创建4个类
# 父类
class myparentclass:
    def method(self):
        return 50

# myparentclass的子类
class parentclass(myparentclass):
    def method1(self):
        print('method1')

# 独立的类
class myclass:
    def method(self):
        return 40

# parentclass的子类
class childclass(parentclass):
    def method2(self):
        print('method2')


print(issubclass(childclass,parentclass))
# 输出结果:True

print(issubclass(childclass,myclass))
# 输出结果:False

print(issubclass(childclass,myparentclass))
# 输出结果:True

print(childclass.__bases__)
# 输出结果:(<class '__main__.parentclass'>,)

print(parentclass.__bases__)
# 输出结果:(<class '__main__.myparentclass'>,)



child = childclass()

print(isinstance(child,childclass))
# 输出结果:True

print(isinstance(child,parentclass))
# 输出结果:True

print(isinstance(child,myparentclass))
# 输出结果:True

print(isinstance(child,myclass))
# 输出结果:False

输出结果:

True
False
True
(<class '__main__.parentclass'>,)
(<class '__main__.myparentclass'>,)
True
True
True
False

在上面的程序中,使用issubclass函数检测类的继承关系时,不只是直接的继承关系返回True,间接的继承关系也会返回True。例如,A继承B,B继承C。那么issubclass(A,C)返回True。使用isinstance函数也是一样,就拿A、B、C三个类举例。如果创建的是A类的实例,那么下面的代码都返回True。

# 其中a是A类的实例
print(isinstance(a,A))
print(isinstance(a,B))
print(isinstance(a,C))

猜你喜欢

转载自blog.csdn.net/weixin_45086637/article/details/90946243
今日推荐