多态

what: 同一个事物有不同的形态。

多态的目的:在不知道对象具体类型的情况下,统一对象调用方法的规范。(通俗讲,即规定实现同样功能的方法,一定要起同样的名字)。

多态的表现形式之一就是继承,先抽象再继承。

多态的父类:定制一套统一的规范,子类中重写该方法,并使用这个方法名。

python中不会强制限制子类一定要用父类规定的方法名,所以出现了抽象类。

抽象类

what:python中内置了abc模块中有抽象类   import abc

抽象类的作用:让子类必须遵循父类的编写规范。

抽象类不可以被实例化

如何实现抽象类:请看代码

# _*_ coding: gbk _*_
# @Author: Wonder
import abc class Father(metaclass=abc.ABCMeta): # 定义时候要加上metaclass = abc.ABCMeta @abc.abstractmethod # 被@abc.abstractmethod装饰的方法,必须在子类中重写,否则会报错。
def bark(self):
print('barking......') @abc.abstractmethod
def run(self):
print('running......') def dance(self):
print('dancing......') class Sub(Father):
def poke(self):
print('poking......')
def bark(self): # 重写父类方法,不写会报错
print('sub barking......')
def run(self):
print('sub running......') test = Sub()
test.run()
test.bark()
test.dance()
test.poke()

 注意点:1.父类名后要加上 classmeta = abc.ABCMeta  2.父类方法上要加上@abc.abstractmethod  3.子类务必遵循父类方法的编写规范进行重写,缺一不可。

鸭子类型

鸭子类型是多态的一种表现形式。

针对不同的对象,根据特点先抽象出相同的方法,再制定一套统一的编写规范

在定义类时,类中的方法都按照统一的规范进行编写。

鸭子类型取消了继承,也取消了抽象类,全凭自觉按照规范编写。这样耦合度就很低。

鸭子类型可以封装出若干个统一的对外的接口,调用相似事物的相同方法,例如:

# _*_ coding: gbk _*_
# @Author: Wonder
class Dog:
def bark(self):
print('dog barking') class Cat:
def bark(self):
print('cat barking') class Bird:
def bark(self):
print('bird barking') def BARK(animal): # 封装统一对外接口
animal.bark() dog = Dog()
cat = Cat()
bird = Bird() BARK(dog)
BARK(cat)
BARK(bird)

  

总结:

多态的三种表现形式:

>>>继承父类        中度耦合(父类给了规范,但子类可以自由发挥,不用父类的规范)

>>>继承抽象类      高耦合(父类给了规范,并严格限制子类按照规范重写override)

>>>鸭子类型          低耦合(没有继承,类中的方法名 全凭自觉 按照规范编写)

绑定方法classmethod和非绑定方法staticmethod

classmethod和staticmethod都是pyhton内置的装饰器

classmethod用来标识 类中的某个方法是类的绑定方法。由类来调用,自动传入方法的第一个参数是类。

之前学过类中不加修饰的方法是对象的绑定方法,对象调用这些方法时,会将自身作为第一个参数传入方法,当成self。

(这一条不知道能否这么总结)  如果对象调用类的绑定方法,第一个传入的值是对象所在的类,子类生成的对象可以调用父类和子类的绑定方法。

# _*_ coding: gbk _*_
# @Author: Wonder
'''
classmethod: 类的绑定方法,只有类可以使用,子类也可以使用
''' class Father:
__key = 'secret' def __init__(self, name):
self.name = name @classmethod
def call(cls, x, y, z):
return x + y, y + z @classmethod
def info(cls, key):
if key == 'wonder':
return cls.__key, cls
return 'FUCK_NO' class Sub(Father):
__key = 1990
pass sub_obj = Sub('name') # 子类实例化一个对象
print(sub_obj.__class__) #查看对象所属的类为 <class '__main__.Sub'>
res = sub_obj.info('wonder')
print(res) # ('secret', <class '__main__.Sub'>) 此处需要注意,cls.__key一定找当前类中的,不可以跨类。
print(Father.call(1, 2, 3)) # (3, 5)
print(Sub.call(4, 5, 6)) # (9, 11)
print(Father.info('won')) # FUCK_NO
print(Sub.info('wonder')) # ('secret', <class '__main__.Sub'>)

 非绑定方法

非绑定方法,相当于在类中定义了一个函数,没有自动传参功能,类和对象都可以使用。

# _*_ coding: gbk _*_
# @Author: Wonder
class Foo:
@staticmethod
def rap(name):
print(f'您的狗名为{name}') foo_obj = Foo()
foo_obj.rap('阿黄')
Foo.rap('阿黑')

  

isinstance 判断一个对象是否是一个类的实例

issubclass 判断一个类是否是另一个类的子类

class A:
pass class B(A):
pass class C:
pass print(isinstance(A(), A)) # True
print(isinstance(B(), A)) # True
print(isinstance(A(), B)) # False
print(isinstance(B(), B)) # True print(issubclass(C, A)) # False
print(issubclass(B, A)) # True

  

补充

uuid模块

import uuid
print(uuid.uuid4()) # a64b11d5-a3f1-46a2-b752-08fc8949457a

uuid.uuid4( )  uuid4是一个纯随机数,与机器无关, 相重的几率很小。通常生成用户id用这个。

CSIC_716_20191128【多态、绑定与非绑定方法、isinstance与issubclass 】的更多相关文章

  1. python面向编程;类的绑定与非绑定方法、反射、内置方法

    一.类的绑定与非绑定方法 ''' 类中定义函数分为了两大类: 1. 绑定方法 特殊之处: 绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入 绑定给对象的方法: 在类中定义函数没有被任何 ...

  2. Day08:继承与派生,多态,封装,绑定与非绑定方法,面向对象高级(反射,__str__,__del__)

    上节课复习:1.编程思想    面向过程        核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么后干什么        基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维 ...

  3. 绑定与非绑定方法及反射,isinstance和issubclass内置函数

    目录 绑定方法与非绑定方法 1.绑定方法 2.非绑定方法(staticmethod) isinstance和issubclass 内置函数 1.isinstance 2.issubclass 反射(面 ...

  4. day 26-1 property、绑定与非绑定方法

    property property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值:就是把一个函数属性的访问方式变成像访问数据属性的方式一样. 我们首先来看一个对比效果 例一:在调用 bmi ...

  5. 封装、property特性及绑定与非绑定方法

    1.封装 (1)什么是封装? 封:属性对外是隐藏的,但对内是开放的: 装:申请一个名称空间,往里面装入一系列名字/属性 (2)为什么要封装? 封装数据属性的目的 首先定义属性的目的就是为了给类外部的使 ...

  6. python 类的封装/property类型/和对象的绑定与非绑定方法

    目录 类的封装 类的property特性 类与对象的绑定方法与非绑定方法 类的封装 封装: 就是打包,封起来,装起来,把你丢进袋子里,然后用绳子把袋子绑紧,你还能拿到袋子里的那个人吗? 1.隐藏属性和 ...

  7. python 面向对象(类的成员,属性,绑定和非绑定,)

    面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实 ...

  8. bound和unbound方法,类的绑定和非绑定是什么

    作者:灵剑链接:https://www.zhihu.com/question/41006598/answer/148994582来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  9. 绑定与非绑定以及property装饰器_day_21 作业题

    1.定义MySQL类 1.对象有id.host.port三个属性 2.定义工具create_id,在实例化时为每个对象随机生成id,保证id唯一 3.提供两种实例化方式,方式一:用户传入host和po ...

随机推荐

  1. Oracle 拼音码函数

    拼音码 select comm.fun_spellcode('数据库') from dual 结果 : SJK 函数 CREATE OR REPLACE FUNCTION COMM.FUN_SPELL ...

  2. 微信小程序分享功能的path路径

    表示被微信小程序坑惨了 糟心的开始写,老板说先不上太复杂,就先显示了两个页面,然后开开心心的发布,测试了几遍,没啥问题呀.结果,一上上去,就被老板批了! 啥呀! 这分享怎么这个鬼样子!明明我看文档都是 ...

  3. Java创建线程后,调用start()方法和run()的区别

    1) start方法: 用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码.通过调用Thread类的start()方法来启动一个线程,这时此 ...

  4. Tomcat---概述

    1.Tomcat  是  一个  免费.开源  的 web应用服务器: 属于  轻量级  应用服务器,在中小型系统.并发量不大的情况下  被广泛使用: 2.Tomcat 是  Apache下的核心项目 ...

  5. NOIP模拟测试17

    T1:入阵曲 题目大意:给定一个N*M的矩形,问一共有多少个子矩形,使得矩形内所有书的和为k的倍数. 60%:N,M<=80 枚举矩形的左上角和右下角,用二维前缀和求出数字之和. 时间复杂度$O ...

  6. Shell基础(六):使用awk提取文本、awk处理条件、awk综合脚本应用、awk流程控制、awk扩展应用

    一.使用awk提取文本 目标: 本案例要求使用awk工具完成下列过滤任务: 1> 练习awk工具的基本用法    2> 提取本机的IP地址.根分区使用率    3> 格式化输出/et ...

  7. shellcode加密与解密

    // Encoder.cpp : Defines the entry point for the console application.// #include "stdafx.h" ...

  8. 简单了解malloc分配内存

    直接看代码 #include <stdio.h> #include <malloc.h> int main() { * * ); printf("分配后请查看内存&q ...

  9. Codeforces gym102222 B.Rolling The Polygon 凸包/余弦定理

    题意: 有一个不保证凸的多边形,让你滚一圈,计算某点滚出的轨迹多长. 题解: 求出凸包后,以每个点为转轴,转轴到定点的距离为半径,用余弦定理计算圆心角,计算弧长. #include<iostre ...

  10. Dubbo入门到精通学习笔记(十三):ZooKeeper集群的安装、配置、高可用测试、升级、迁移

    文章目录 ZooKeeper集群的安装.配置.高可用测试 ZooKeeper 与 Dubbo 服务集群架构图 1. 修改操作系统的/etc/hosts 文件,添加 IP 与主机名映射: 2. 下载或上 ...