多态的定义:
- 在继承关系类中,调用父类对象的方法,实际能调用子类覆盖版本的方法
- 多态调用的方法与对象有关,不与类型有关
- python的全部对象都只有动态,没有静态(c++,java)
对上述话术的解析:
多态可以理解为多种状态,可以理解为一个人有多种状态,在学习函数的过程中,我们发现在调用函数的时候我们永远调用的是唯一的函数,但是我们了解了继承和派生就不一样了,多态就是在继承派生的关系中,调用父类的方法,实际能调用子类覆盖版本的方法的现象叫做多态,其实多态分为两种,一种是静态,一种是动态,静态是C++,java中存在的,python中只有动态,因为python是解释执行的语言,是运行时执行的,所以可以非常简单的实现动态
首先举一个静态的列子:(只是用于说明静态时什么意思,并不是真正的静态)
class Shape:
def draw(self):
print('Shape.draw被调用')
class Point(Shape):
def draw(self):
print('Point.draw被调用')
class Circle(Point):
def draw(self):
print('Circle.draw被调用')
def my_draw(Circle, s):
s.draw()
s1 = Circle()
s2 = Point()
my_draw(s1)
在静态语言当中,任何对象都有类型,如果my_draw方法中 参数s的类型时Circle中的类型,那么s.draw就一定调用Circle中的draw方法,这就是静态语言,静态就是在编译阶段就已经决定了参数s和其他类时同一个类型,是已经定死了,但是python中不一样,python没有静态语言,python的变量没有类型,一切都是在运行时决定
class Shape:
def draw(self):
print('Shape.draw被调用')
class Point(Shape):
def draw(self):
print('Point.draw被调用')
class Circle(Point):
def draw(self):
print('Circle.draw被调用')
def my_draw(s):
s.draw()
s1 = Circle()
s2 = Point()
my_draw(s1)
my_draw(s2)
动态是看传进去是谁,my_draw(s1)传进去是Circle的,那么就打印Circle的方法,传进入是Piont的就是调用点的方法,也就是my_draw这个方法调用谁是不确定的,都是取决于s的类型,绑定的哪个类来决定,这种调用方法就是动态方法,也就是多态