多态和多态性的区别

1.转载于——https://blog.csdn.net/weigb/article/details/1864192

多态是基于对抽象方法的覆盖来实现的,用统一的对外接口来完成不同的功能。重载也是用统一的对外接口
来完成不同的功能。那么两者有什么区别呢?
重载,是指允许存在多个同名方法,而这些方法的参数不同。重载的实现是:编译器根据方法不同的参数表
,对同名方法的名称做修饰。对于编译器而言,这些同名方法就成了不同的方法。它们的调用地址在编译期
就绑定了。
多态:是指子类重新定义父类的虚方法(virtual,abstract)。当子类重新定义了父类的虚方法后,父类根据
赋给它的不同的子类,动态调用属于子类的该方法,这样的方法调用在编译期间是无法确定的。
不难看出,两者的区别在于编译器何时去寻找所要调用的具体方法,对于重载而言,在方法调用之前,编译
器就已经确定了所要调用的方法,这称为“早绑定”或“静态绑定”;而对于多态,只有等到方法调用的那一刻

,编译器才会确定所要调用的具体方法,这称为“晚绑定”或“动态绑定”。 

2.转载于——http://www.cnblogs.com/luchuangao/p/6739557.html

一 多态:

多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承)

 

  1. 序列类型有多种形态:字符串,列表,元组
  2. 动物有多种形态:人,狗,猪
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#多态:同一种事物的多种形态,动物分为人类,猪类(在定义角度)
class Animal:
    def run(self):
        raise AttributeError('子类必须实现这个方法')
 
 
class People(Animal):
    def run(self):
        print('人正在走')
 
class Pig(Animal):
    def run(self):
        print('pig is walking')
 
 
class Dog(Animal):
    def run(self):
        print('dog is running')
 
peo1=People()
pig1=Pig()
d1=Dog()
 
peo1.run()
pig1.run()
d1.run()

 

文件有多种形态:文件、文本文件、可执行文件

二 多态性

(1)什么是多态性(注意:多态与多态性是两种概念)

多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#多态性:一种调用方式,不同的执行效果(多态性)
def func(obj):
    obj.run()
 
func(peo1)
func(pig1)
func(d1)
 
 
# peo1.run()
# pig1.run()
 
 
# 多态性依赖于:继承
##多态性:定义统一的接口,
def func(obj): #obj这个参数没有类型限制,可以传入不同类型的值
    obj.run() #调用的逻辑都一样,执行的结果却不一样
 
func(peo1)
func(pig1)
 
func(d1)

1、

综上可以说,多态性是一个接口(函数func),多种实现(如f.click())

二、为什么要用多态性(多态性的好处)

其实大家从上面多态性的例子可以看出,我们并没有增加上面新的知识,也就是说Python本身就是支持多态性的,这么做的好处是什么呢?
(1)增加了程序的灵活性
  以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)
(2)增加了程序额可扩展性
  通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页