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的子类: []