一、多态
搜资发现目前对多态的解释有两种:
第一种:
不同的子类对象调用相同的父类方法,产生不同的执行结果,多态可以增加代码的灵活度以继承和重写父类方法为前提,是调用方法的技巧,不会影响到类的内部设计。
多态的前提:
- 要有方法重写
- 要有继承关系
- 父类引用指向子类对象 (父类只能调用自己的方法,但是如果自己的方法被子类覆盖了,那么调用的就是子类的。子类独有的方法,父类调用不了)
第二种:
多态:一类事物在不同时刻有多种形态。大致意思就是你不知道变量指向的是哪种对象,也能够对其执行操作,且操作的行为将随对象所属的类型(类)而异。
example:(结合实例理解)
class Animal:
def run(self):
print('animal is running')
class People(Animal):
def run(self):
print('man is running')
class Pig(Animal):
def run(self):
print('pig is running')
class Dog(Animal):
def run(self):
print('dog is running')
people = People()
pig = Pig()
dog = Dog()
people.run()
pig.run()
dog.run()
结果图
以第一种方法理解example
People、Pig、Dog为继承Animal类的三个不同子类。这三个子类都重写了父类的run方法。当分别以这三个子类创建对象的后,调用相应的父类的run方法,则优先使用子类中重写的方法,此时产生了三种不同的输出结果(结果图)。
以第二种方法理解example
People、Pig、Dog为继承Animal类的不同子类,但是由于他们都是继承自父类Animal的,因而他们实际上也是属于Anmial类的(一类事物)。此时我们知道people、pig、dog这三个对象是Animal类型的,但是不用知道它们所属的确切类型(不知道变量指向的是哪种对象)就能够对这三个实例调用run()方法(能够执行操作),并且通过结果图可以发现,输出结果根据这三个实例所属的类型不同(分别是Man、Pig、Dog类)而发生变化(且操作的行为将随对象所属的类型(类)而异)。
帮助理解第二种方法,再编写一个函数,这个函数接受一个Animal类型的变量。
def run_example(animal):
animal.run()
run_example(people)
run_example(pig)
run_example(dog)
'''此时我们只需要传入animal类型数据,并不需要它们所属的确切类型,就可以执行操作
并且你会通过结果发现,根据传入的对象所属的类型,输出结果发生变化,这就是多态的魅力'''
结果图