• 多态



    多态

    首先我们要了解

    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装饰的方法,不管谁来调用,都没有自动传值一说




  • 相关阅读:
    C#中的async和await
    Windows 10 error code 0x80072efd
    Winform中调用js函数
    Windows 10 x64 安装 Visual Basic 6.0 SP6
    用谷歌浏览器来当手机模拟器
    Windows 10 解决 0x80070021 错误
    正则匹配所有中英文标点
    本地网站部署注意细节
    电信光猫 路由+拨号混合设置 备忘
    Restful 支持 自定义序列化
  • 原文地址:https://www.cnblogs.com/yangwei666/p/8856446.html
Copyright © 2020-2023  润新知