python编程--多态

面向对象的程序设计具有三大特性:封装性,继承性,多态性

由生活中的多态性到编程

生活中的多态性:
幼儿园门口家长们要接孩子放学了,广播响起:
请各位家长照顾好自己的小孩,希望你们度过一个美好的周末!
此刻,家长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)

小结

发生多态必须满足以下两个前提条件
继承:
多态一定是发生在父类和子类间

重写:
多态子类重写了父类的方法

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值