面向对象的程序设计具有三大特性:封装性,继承性,多态性
由生活中的多态性到编程
生活中的多态性:
幼儿园门口家长们要接孩子放学了,广播响起:
请各位家长照顾好自己的小孩,希望你们度过一个美好的周末!
此刻,家长A就会接上A的孩子,家长B就会接上B的孩子,虽然对于每个人都是‘自己的孩子’,但这个‘自己’表示的却是不同的人。
延伸到编程中就是:虽然都是同一个变量(“自己”)调用同一个的方法(“接自己的孩子”),但该方法属于哪个类的对象(如“A”的对象),完全是由程序在执行时(放学接孩子)确定的。这就是类编程中的多态性。
举例
class Animal:
def __init__(self, name):
self.name = name
@staticmethod # 封装
def animal_talk(obj, string):
obj.talk(obj.name, string)
# 注意这里用了两种不同方式输出
class Cat(Animal):
def talk(self, name, words):
print(name + ' is saying %s' % words)
class Dog(Animal):
def talk(self, name, words):
print('%s is saying %s' %(name, words))
#注意方法的调用:
#一个是Animal.animal_talk; 一个是d.animal_talk
c = Cat("catname")
Animal.animal_talk(c, "I'm a cat")
d = Dog("dogname") # create a Dog d named dogname; d is an animal
d.animal_talk("I'm a dog")
----------------------------------------------
catname is saying I'm a cat
dogname is saying I'm a dog
上图代码定义了Cat类 和Dog类,两者都继承于Animal 类,且都重写了基类的talk() 方法,变量cd在执行talk()方法时,由于cd指向的实例对象不同,代码会自动根据cd的具体对象来决定执行哪个talk方法,这就是多态性!
多态性的应用实例(简单版)
class Animal:
def initial(self, animalType):
animalType.growPlace()
class Fish:
def growPlace(self):
print("in water")
# a = Animal() # creating an animal a
# f = Fish() # creating a fish 'f'
# a.initial(f)
Animal().initial(Fish())
多态性的应用实例(进阶版)
class Animal:
def initial(self, animalType):
animalType.growPlace(self)
class Fish:
def __init__(self, s):
self.growing_place = s
def growPlace(self, growing_place):
print("It is growing in " + self.growing_place)
a = Animal() #creating an animal a
f = Fish('water') #creating a fish 'f' which is living in 'water'
a.initial(f)
小结
发生多态必须满足以下两个前提条件
继承:
多态一定是发生在父类和子类间
重写:
多态子类重写了父类的方法