Python基础学习(19)—面向对象7(多态的具体说明)

多态

多态都是同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果

1 面向对象的三大特征之一
多态字面上理解多种形态:人(黑人,白人,黄种人)

2 发生多态的条件
1 继承,多态是发生在子类和父类之间的
2 重写,子类重写了父类的方法

下面举一个简单的例子说明一下

class A():
    # 定义一个方法,打印自己的类名
    def ziji(self,name):

        print('%s...'%name)

class B(A):

    def ziji(self,name):
        print('%s...'%name)

class C(A):

    def ziji(self,name):

        print('%s...'%name)
a = A()
a.ziji('A')
# A...

a = B()
a.ziji('B')
# B...

a = C()
a.ziji('C')
# C...

这里说明一下,B,C 的类都继承A且都重写了父类的ziii()方法,
同一个变量a在执行同一个方法ziji()时,由于x指向的对象不同,所以实际调用的并不是同一个ziji()方法,这就是一种多态

其实在多态的基础上衍生了一种更灵活的编程机制
多态的实际应用


class Game1:

    def __init__(self,name):

        self._name = name

    @property
    def name(self):

        return self._name

    @name.setter
    def name(self,name):

        self._name = name

class Game2:

    def __init__(self,name):

        self._name = name

    # def __len__(self):
    #
    #     return 5

    @property
    def name(self):

        return self._name

    @name.setter
    def name(self,name):

        self._name = name



# 定义一个函数
def speak(obj):

    print('我要玩%s'%obj.name)

a = Game1('王者荣耀')


print(a.name)

speak(a) # 我要玩王者荣耀

speak(Game1) # 我要玩<property object at 0x0000018B6F835C78>
#
# a = Game2('吃鸡')

speak(a) # 我要玩吃鸡

实际上传入的参数对象只要有name属性的都可以调用speak()方法

例二:

def speak2(obj):

    # 类型检查
    if isinstance(obj,Game1):

        print('我要玩%s'%obj.name)

a = Game1('LOL')

speak2(a) # 我要玩LOL

在speak2这个函数中做了一个类型检查,也就是只有obj是A类型的对象的时候,才可以正常使用,其他类型的对象无法使用该函数,这个函数其实就违反了多态
违反了多态的函数,只适用于一种类型的对象,无法处理其他类型的对象,这样导致函数的适用性非常差

下面再介绍一个鸭子模型,也是多态的一种

class Game():

    def name(self,name):

        name.play(self)

class Game1():

    def play(self,name):
        print('我要玩%s' % name)
a = Game()

a.name(Game1()) # 我要玩<__main__.Game object at 0x000001CD04D132E8>

实际上传入的参数对象只要有play()方法的都可以调用name方法

多态都是同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果

总结一下
面向对象的三大特征
封装 确保对象中的数据更安全
继承 保证了对象的可扩展性
多态 保证了程序的灵活性

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值