python面向对象多态_python之面向对象中的多态

直接看代码:

classDog:

def __init__(self,name):

self.name=name

def play(self):

print("%s在汪汪汪" %self.name)classSonDog(Dog):

def play(self):

print("%s不仅会汪,还会飞" %self.name)classPerson:

def __init__(self,name):

self.name=name

def game(self,dog):

print("%s正在和%s快乐地做游戏" %(self.name,dog.name))

dog.play()

wc= Dog("旺财")

p= Person("妞妞")

p.game(wc)

输出:

说明:SonDog继承了Dog,并重写了play方法 。在Person类中,game方法需要传入一个Dog的实例。

假设我们传给game的不是Dog类,而是其子类,那么效果又是怎么样的呢?

# wc = Dog("旺财")

sonWc= SonDog("旺财儿子")

p= Person("妞妞")

p.game(sonWc)

输出:

我们发现,调用的是子类的play方法。

在python中,多态体现得没那么明显。我们可以将其展开来看。python是一门动态语言,不需要指定变量的类型,会在运行阶段自动判别变量的类型。因此,对于某个类而言,在实例化时,不需要指定它是什么类,比如说在java中有Dog这么一个类,在新建它的实例时,都会使用Dog dog = new Dog(),而在python中只需要dog = Dog()。 而所谓的多态,就是父类的引用指向子类的对象,拿java举例:SonDog继承了Dog,在实例化时Dog dog = new SonDog(),这就体现了一种多态性。为什么这么说?假设有多个不同的子类继承了该类,那么,该父类的引用指向不同子类的实例,就可以实现不同的功能。这就是多态的思想。

再拿本段代码而言,在Person类中的game方法,需要传入的是一个Dog对象(python并不用显示的指定它的类型),当传入wc时很好理解,但是,为什么还可以传入sonWc?之前也说过了,可以这么理解:Dog sonWc = new SonDog("旺财儿子"),这不就是父类的引用指向子类的对象了么。子类重写了父类的play方法,在调用时,会调用子类的play方法。

那么,假设父类中有而子类没有,子类中有而父类中没有的方法会怎么样呢?

classDog:

def __init__(self,name):

self.name=name

def play(self):

print("%s在汪汪汪" %self.name)

def test1(self):

print("父类的test1方法")classSonDog(Dog):

def play(self):

print("%s不仅会汪,还会飞" %self.name)

def test2(self):

print("子类的test2方法")classPerson:

def __init__(self,name):

self.name=name

def game(self,dog):

print("%s正在和%s快乐地做游戏" %(self.name,dog.name))

dog.play()

dog.test1()

dog.test2()

# wc= Dog("旺财")

sonWc= SonDog("旺财儿子")

p= Person("妞妞")

p.game(sonWc)

输出:

假设,我们传入的就是父类的实例:

wc = Dog("旺财")

# sonWc= SonDog("旺财儿子")

p= Person("妞妞")

p.game(wc)

输出:

父类就访问不到子类的特有的方法。

讲这么一个是为了说明什么,多态使得父类可以访问到子类的方法和属性,虽然在python中并不显得那么明显。

总结:

本文通过例子讲述了python中的多态:父类的引用指向子类的对象。

另外,像方法的重写和重载也是多态的一种体现。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值