Python类学习(八)——多态、issubclass()、isinstance()检查变量类型、__bases__查找父类、__subclasses__()查找子类

1. 什么是多态

python的变量没有声明类型,因此一个变量可以引用不同的对象;当一个变量引用方法名相同的方法时,有可能呈现出不同的操作,具体呈现出哪种操作由该变量所引用的对象来决定,这就是多态;

class Dog:
    def inf(self):
        print("我是一只狗")
class Pig:
    def inf(self):
        print("我是一只猪")

x = Dog()
x.inf()     # 我是一只狗
x = Pig()
x.inf()     # 我是一只猪

2. 多态优势

# 定义一些图形类,每个图形类都有自己的draw方法,这些draw方法的方法名和形参个数相同
class Rectangle:
    def draw(self, width, height):
        print("绘制矩形宽为%s,高为%s"%(width, height))
class Triangle:
    def draw(self, width, height):
        print("绘制三角形底为%s,高为%s" % (width, height))

# 定义一个画图类
class Canvas:
    # 定义一个画图方法,shape用于传入对象,然后函数将调用该对象的draw方法
    def draw_shape(self, shape, width, height):
        shape.draw(width, height)

c = Canvas()
c.draw_shape(Rectangle(), 10, 5)      # 绘制矩形宽为10,高为5
c.draw_shape(Triangle(), 20, 10)      # 绘制三角形底为20,高为10

3. 检查类型

issubclass(cls, class_or_tuple)

检查cls是否是后面一个类或者类组成的元组中的任意一个类的子类

isinstance(obj, class_or_tuple)

检查obj是否是后面一个类或者类组成的元组中的任意一个类的对象或者子类的对象

print(issubclass(str, object))  # True
print(isinstance("hello", str)) # True

1)python为所有类提供一个__bases__属性,通过该属性可以查看该类的所有直接父类,该属性返回所有直接父类组成的元组;

class A:
    pass
class B(A):
    pass

print("A的父类:", A.__bases__)         # A的父类: (<class 'object'>,)
print("B的父类:", B.__bases__)         # B的父类: (<class '__main__.A'>,)

2)python为所有类提供了一个__subclasses__()方法,通过该方法可以查看该类的所有直接子类,该方法返回该类的所有子类组成的列表;

class A:
    pass
class B(A):
    pass

print("A的子类:", A.__subclasses__())         # A的子类: [<class '__main__.B'>]
print("B的子类:", B.__subclasses__())         # B的子类: []

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值