多态


多态

首先我们要了解

1、什么是多态
多态指的是同一种事物具有多种形态。
比如 '水',现实生活中我们的水具有 液态,固态 气态,
水在这些形态下也都是水。
2、为什么要用多态

用基类创建一套统一的规则,强制子类去遵循(使用抽象类实现),这样便可以
在不用考虑对象具体类型的前提下而直接使用对象下的方法

3、如何用多态
 1 # 需要提前导入 abc模块
 2 import abc #abstract class
 3 class Animal(metaclass=abc.ABCMeta):
 4     @abc.abstractmethod
 5     def eat(self):
 6         pass
 7 
 8     @abc.abstractmethod
 9     def bark(self):
10         pass
11 
12 # obj=Animal() # 抽象基类本身不能被实例化
13 
14 class Cat(Animal):
15     def eat(self):
16         print('cat eat')
17 
18     def bark(self):
19         print('喵喵喵')
20 
21 class Dog(Animal):
22     def eat(self):
23         print('dog eat')
24 
25     def bark(self):
26         print('汪汪汪')
27 
28 
29 
30 c=Cat()
31 d=Dog()
32 
33 c.bark()
34 d.bark()
View Code

补充:

鸭子类型

 Python崇尚鸭子类型,即‘如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’

python程序员通常根据这种行为来编写程序。例如,如果想编写现有对象的自定义版本,可以继承该对象

也可以创建一个外观和行为像,但与它无任何关系的全新对象,后者通常用于保存程序组件的松耦合度。

例1:利用标准库中定义的各种‘与文件类似’的对象,尽管这些对象的工作方式像文件,但他们没有继承内置文件对象的方法

 1 #二者都像鸭子,二者看起来都像文件,因而就可以当文件一样去用
 2 class TxtFile:
 3     def read(self):
 4         pass
 5 
 6     def write(self):
 7         pass
 8 
 9 class DiskFile:
10     def read(self):
11         pass
12     def write(self):
13         pass

列2:

 1 class Disk:
 2     def read(self):
 3         print('disk read')
 4 
 5     def write(self):
 6         print('disk write')
 7 
 8 
 9 class Txt:
10     def read(self):
11         print('txt read')
12 
13     def write(self):
14         print('txt write')
15 
16 
17 class Process:
18     def read(self):
19         print('process read')
20 
21     def write(self):
22         print('process write')
23 
24 
25 obj1=Disk()
26 obj2=Txt()
27 obj3=Process()
28 
29 
30 obj1.read()
31 obj2.read()
32 obj3.read()
View Code

绑定方法与非绑定方法:

一:绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入):

    1. 绑定到类的方法:用classmethod装饰器装饰的方法。

                为类量身定制

                类.boud_method(),自动将类当作第一个参数传入

              (其实对象也可调用,但仍将类当作第一个参数传入)

    2. 绑定到对象的方法:没有被任何装饰器装饰的方法。

               为对象量身定制

               对象.boud_method(),自动将对象当作第一个参数传入

             (属于类的函数,类可以调用,但是必须按照函数的规则来,没有自动传值那么一说)

二:非绑定方法:用staticmethod装饰器装饰的方法

        1. 不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说。就是一个普通工具而已

    注意:与绑定到对象方法区分开,在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,对象调用该方法会自动传值,而staticmethod装饰的方法,不管谁来调用,都没有自动传值一说




原文地址:https://www.cnblogs.com/yangwei666/p/8856446.html