天天看点

多态|学习笔记

开发者学堂课程【Python 语言基础 3:函数、面向对象、异常处理:多态】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:

https://developer.aliyun.com/learning/course/601/detail/8754

多态

内容简介

一、多态的定义

二、面向对象的三大特征

多态是面向对象的三大特征之一

多态从字面上理解是多重形态

一个对象可以以不同的形态去呈现

例如:定义两类

Class A:

Def __init__(self,name):

Self._name = name

@property

def  name(self):

return self._name

@name. setter

def  name(self ,name):

Self._name=name

Class B:

def__init__(self, name) :

self._ name=name

def__len__(self):

return 10

@property

def  name(self ) :

return self. name

@name.setter

def  name(self, name ):

self.2 name = name

Class C:

pass

a = A( ‘孙悟空’)

b = B(‘猪八戒’)

c = C( )

1、定义一个函数

l对于 say_hello( ) 这个函数来说,只要对象中含有 name 属性,它就可以作为参数传递,这个函数并不会考虑对象的类型,只要有 name 属性即可,这就是多态。

def  say_hello(obj):

print(‘你好%s’%obj.name)

l 在 say_hello_2 中做了一个类型检查,只有 obj 是 A 类型的对象时,才可以正常使用,其他类型的对象都无法使用该函数,这个函数就违反了多态

l 注意:像 isinstance() 违反多态代码的这种函数,在开发中一般是不会使用的

def say_hello_2(obj):

#做类型检查

If  isinstance(obj  ,A)

print(‘你好%s’%obj.name)

l 违反了多态的函数,只适用于一种类型的对象,无法处理其他类型对象,这样导致函数的适应性非常差

2、理解多态:鸭子类型

l 如果一个东西,走路像鸭子,叫声像鸭子,那么它就是鸭子

l 有了多态以后方法、定义更加的灵活、参数不用考虑具体类型,只需要确保符合某个特征、某个属性、某个方法,只要符合某个特征,就可以使用多态。

3、举例 len()函数(多态最好的体现)

1 =[1,2,3]

S = ‘hello’

print(len(10))

print(len(s))

print(len(b))

l 之所以一个对象能通过 len()来获取长度,是因为对象中具有一个特殊的方法_ len_ 换句话说,只要对象中具有 _ len_ 特殊方法,就可以通过 len( )来获取它的长度.

二、面向对象的三大特征(所有面向对象的语言必须具备这三个特点)

1、封装:确保对象中的数据安全

2、继承:保证了对象的可扩展性

3、多态:保证了程序的灵活性,如果我们的方法、类型和概念绑定,函数的通用性将会降低,当具有了多态,函数便更加灵活。