多态
多态指的是同一种类型的事物,不同的形态
多态的目的:
多态也称之为‘多态性’,目的是为了 在不知道对象具体类型的情况下,统一对象调用的方法规范(比如:名字)
多态的表现“形式之一”就是继承
先抽象,再继承
import abc
class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
@abc.abstractmethod
def talk(self):
pass
class People(Animal): #动物的形态之一:人
def talk(self):
print('say hello')
class Dog(Animal): #动物的形态之二:狗
def talk(self):
print('say wangwang')
class Pig(Animal): #动物的形态之三:猪
def talk(self):
print('say henghengheng')
Python的多态性是指:在不考虑实例类型的情况下使用实例,也就是说不同类型的实例有 相同的调用方法。比如人,猫,狗,等等只要是继承了animal就可以直接调用它的talk()方法
peo=People()
dog=Dog()
pig=Pig()
#peo、dog、pig都是动物,只要是动物肯定有talk方法
#于是我们可以不用考虑它们三者的具体是什么类型,而直接使用
peo.talk()
dog.talk()
pig.talk()
#更进一步,我们可以定义一个统一的接口来使用
def func(obj):
obj.talk()
1.增加了程序的灵活性
以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)
2.增加了程序额可扩展性
通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用
抽象类
1、在python中内置的abc模块中,有一个抽象类
2、抽象类的作用:让子类必须遵循父类的编写规范
3.如何实现抽象类
父类需要继承abc模块中,metaclass=abc.ABCMeta
在父类的方法中,需要装饰上 abc.abstractmethod
注意 在python中不推荐使用抽象类。
注意: 子类必须按照父类的方法编写规范,缺一不可。(只要父类中有几个抽象方法,子类就必须要定义几个)
鸭子类型
1.什么是鸭子类型?
不同的对象,只要长得像鸭子,动作行为像鸭子,那它就是鸭子!
当看到一只鸟走起来像鸭子,游泳起来像鸭子,叫起来也像鸭子,那么这只鸟就可以被称为鸭子.
鸭子类型是多态的一种表现形式。
2.为什么要有鸭子类型?
不同对象,先抽象出相同类型的方法,给他们定制一套统一的规范。
所有的类,在定义时都按照统一的规范进行编写。
- 多态的三种表现形式:
-
继承父类 ****
- 耦合度高,程序的可扩展性低
-
继承抽象类 ***
- 耦合度极高,程序的可扩展性极低
-
鸭子类型: *****
- 耦合度低,程序的可扩展性高
-
class A:
def login(self):
pass
def register(self):
pass
class B:
def login(self):
pass
def register(self):
pass
# A,B两个类,没有任何关系,独立两个,但是里面的功能相似,所以python一般会将类似于A,B两个类
# 里面的相似的功能让其命名相同.
# A,B虽然无关系,但是很默契的制定了一个规范.让你使用起来更方便.
## 个人理解:
#你可以定义一个公共的接口, 简化代码 .牛逼人都这么干
def func(obj):
obj.register()
obj.login()
__len__()
str1 = 'tank is very handsome!!!'
list1 = ['tank', 'is', 'very', 'handsome!!!']
# print(str1.__len__())
# print(list1.__len__())
# 自定义统计长度函数
def LEN(obj):
return obj.__len__()
print(LEN(str1))
print(LEN(list1))
print(len(str1))
print(len(list1))