鱼C论坛

 找回密码
 立即注册
查看: 3210|回复: 3

关于多态的一个问题,一直想不通

[复制链接]
发表于 2020-2-22 21:16:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
class Dog(object):
    def work(self):
        pass

class ArmyDog(Dog):
    def work(self):
        print('追击敌人')

class DrugDog(Dog):
    def work(self):
        print('追查毒品')

class Person(object):
    def work_with_dog(self, dog):  # 只要能接收父类对象,就能接收子类对象
        dog.work()  # 只要父类对象能工作,子类对象就能工作。并且不同子类会产生不同的执行效果。

p = Person()
p.work_with_dog(ArmyDog())
p.work_with_dog(DrugDog())
追击敌人
追查毒品

问题:像上面类Person和类Dog并不是父子关系,那Person是怎么接受Dog里面的对象,进而连接他的子类DurgDog和ArmyDog,求助大神!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-22 21:34:58 | 显示全部楼层
因为传入了Dog类啊
也就是说,
  1. p.work_with_dog(ArmyDog())
复制代码

等于
  1. dogA = ArmyDog()
  2. dogA.work()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-22 21:55:26 | 显示全部楼层
你的问题本身就有问题。
python 里万物皆对象,所以 Person 能接收任何对象, 而且根本不用理会这个对象是什么东西,怎么创建的,被什么创建的,都不用管。
  1. def work_with_dog(self, dog)
复制代码

这一行里的 dog 只是参数名称而已,你改成 cat 也不会发生改变。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-23 00:28:03 | 显示全部楼层
  1. p = Person() # 产生一个person对象p
  2. p.work_with_dog(ArmyDog()) #产生一个armydog匿名对象
  3. # armydog匿名对象被传给person对象p的work_with_dog方法,而armydog 是基于dog类的,所以可以调用dog类的方法(如果子类没有实现此方法)。
  4. p.work_with_dog(DrugDog()) #产生一个drugdog对象
  5. # 道理同上
  6. # 至于如何实现多态,那是c++的问题,大概是动态判定。因为python是动态语言,直到运行代码时才会检查代码能否正常执行,确切的说是执行到对应的代码段(函数)。执行的时候,又因为python的语言特性(语法不严格),所以会对任何对象尝试执行,如果执行不出错,就继续,如果存在错误就中断。这个过程中会判断对象的类型,当然包括类,所以什么子类,父类的,这时就会被检查了,也会进行相应的调用,依据语法规则。
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-22 18:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表