python abstractmethod_Python装饰器abstractmethod、property、classmethod、staticmethod及自定义装饰器...

2023-11-17

总览:

@abstractmethod:抽象方法,含abstractmethod方法的类不能实例化,继承了含abstractmethod方法的子类必须复写所有abstractmethod装饰的方法,未被装饰的可以不重写

@ property:方法伪装属性,方法返回值及属性值,被装饰方法不能有参数,必须实例化后调用,类不能调用

@ classmethod:类方法,可以通过实例对象和类对象调用,被该函数修饰的方法第一个参数代表类本身常用cls,被修饰函数内可调用类属性,不能调用实例属性

@staticmethod:静态方法,可以通过实例对象和类对象调用,被装饰函数可无参数,被装饰函数内部通过类名.属性引用类属性或类方法,不能引用实例属性

案例讲解:

@abstractmethod

用于程序接口的控制,正如上面的特性,含有@abstractmethod修饰的父类不能实例化,但是继承的子类必须实现@abstractmethod装饰的方法

# -*- coding:utf-8 -*-

from abc import ABC, abstractmethod

class **A**(**ABC**):

@abstractmethod

def **test**(self):

pass

class **B**(**A**):

def **test_1**(self):

print("未覆盖父类abstractmethod")

class **C**(**A**):

def **test**(self):

print("覆盖父类abstractmethod")

if __name__ == '__main__':

a = A()

b = B()

c = C()

前两个分别报错如下:

a = A()

TypeError: Can't instantiate abstract class A with abstract methods test

b = B()

TypeError: Can't instantiate abstract class **B** **with** **abstract** **methods** **test**

第三个实例化是正确的

@ property

将一个方法伪装成属性,被修饰的特性方法,内部可以实现处理逻辑,但对外提供统一的调用方式,实现一个实例属性的get,set,delete三种方法的内部逻辑,具体含义看示例code。

# -*- coding:utf-8 -*-

# -*- coding:utf-8 -*-

class **Data**:

def **__init__**(self):

self.number = 123

@property

def **operation**(self):

return self.number

@operation.setter

def **operation**(self, number):

self.number = number

@operation.deleter

def **operation**(self):

del self.number

image

@ classmethod,staticmethod

类方法classmethod和静态方法staticmethod是为类操作准备,是将类的实例化和其方法解耦,可以在不实例化的前提下调用某些类方法。两者的区别可以这么理解:类方法是将类本身作为操作对象,而静态方法是独立于类的一个单独函数,只是寄存在一个类名下。类方法可以用过类属性的一些初始化操作。

# -*- coding:utf-8 -*-

class **Test**:

num = "aaaa"

def **__init__**(self):

self.number = 123

@classmethod

def **a**(cls, n):

cls.num = n

print(cls.num)

@classmethod

def **b**(cls, n):

cls.a(n)

@classmethod

def **c**(cls, n):

cls.number = n

@staticmethod

def **d**(n):

Test.b(n)

分别通过类对象、实例化对象来调用

image

装饰器函数机制

谈装饰器的原理就不得不先理解Python的闭包,在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包即内部函数对外部函数作用域里变量的引用(非全局变量),则称内部函数为闭包。

装饰器是建立在闭包的基础上,将被装饰函数传入闭包函数中执行则形成了装饰器。

闭包:

# -*- coding:utf-8 -*-

def **test**(a):

def **add**(a):

print(a+2)

return add(a)

if __name__ == '__main__':

test(2)

2

装饰器原型:

# -*- coding:utf-8 -*-

def B(fn):

def b():

return fn()+3

return b

@B

def add():

return 3

if __name__ == '__main__':

str = fn()

print(str)

----------------

6

当被装饰函数带参数:

# -*- coding:utf-8 -*-

def **B**(fn):

def **b**(*args, **kwargs):

return str(fn(*args, **kwargs))+"装饰"

return b

@B

def **fn**(*args, **kwargs):

num = 0

for i in args:

num +=i

for i in kwargs.values():

num += i

return num

if __name__ == '__main__':

num = fn(1, 2, 3, a=4, b=5)

print(num)

----------------

15装饰

当装饰函数带额外参数,应该在装饰函数外再包裹一层函数

# -*- coding:utf-8 -*-

def **A**(n):

def **B**(fn):

def **b**(*args, **kwargs):

return n+str(fn(*args, **kwargs))+"装饰"

return b

return B

@A("包裹前缀")

def **fn**(*args, **kwargs):

num = 0

for i in args:

num +=i

for i in kwargs.values():

num += i

return num

if __name__ == '__main__':

num = fn(1, 2, 3, a=4, b=5)

print(num)

----------------

包裹前缀15装饰

当多个装饰函数装饰一个函数时的执行顺序

# -*- coding:utf-8 -*-

def **A**(fn):

print(1)

def **run**():

print(2)

fn()

print('a')

return run

def **B**(fn):

print(3)

def **run**():

print(4)

fn()

print('b')

return run

def **C**(fn):

print(5)

def **run**():

print(6)

fn()

print('c')

return run

@A

@B

@C

def **test**():

print(7)

if __name__ == '__main__':

test()

----------------

5

c

3

b

1

a

2

4

6

7

由此可以得出多装饰情况下的运行情况:初始化运行从下到上,内部执行顺序从内到外。因为开始执行时会按照装饰顺序,组装成一个函数,而这个函数从最外层的return执行到最内层,故有上述顺序,就像剥洋葱一样。

类装饰器

# -*- coding:utf-8 -*-

class **Add**:

def **__init__**(self, fn):

print("初始化")

self.num = 44

self.fn = fn

def **__call__**(self, *args, **kwargs):

print("类装饰器开始工作")

return self.fn(self.num)

@Add

def **test**(n):

return 4+n

if __name__ == '__main__':

num = test()

print(num)

----------------

初始化

类装饰器开始工作

48

类装饰器使用地方较少,核心是通过复写类的回调方法call.

装饰器应用场景

引入日志

函数执行时间统计

执行函数前预备处理

执行函数后清理功能

权限校验等场景

缓存

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python abstractmethod_Python装饰器abstractmethod、property、classmethod、staticmethod及自定义装饰器... 的相关文章

  • 深入PCI与PCIe之一:硬件篇

    PCI总线和设备树是X86硬件体系内很重要的组成部分 几乎所有的外围硬件都以这样或那样的形式连接到PCI设备树上 虽然Intel为了方便各种IP的接入而提出IOSF总线 但是其主体接口 primary interface 还依然是PCIe形
  • 人才盘点的主角是业务部门负责人还是HR?

    你的企业 是否存在以下问题 人才储备不足 关键岗位人员离职后 没有合适的马上接替 人才质量不高 企业战略变革转型期 不知谁可以引领和驱动变革 人才现状不清 新的业务 新的项目要开拓 不知合适的人才在哪里 人才分布不均 成熟业务部门人才扎堆
  • gin框架38--使用中间件

    gin框架38 使用中间件 介绍 案例 说明 介绍 本文主要介绍如何在gin框架中使用中间件 并通过案例加以说明 使用MyBenchLogger中间件来输出特有的日志 用AuthRequire中间件来实现基础认证 案例 package ma
  • Cost function

    cost function的形式 cost function的推导满足以下过程 1 认为error 满足某个分布 写出样本点xi的样本的error 2 认为样本点是相互独立的 推导出其对数似然函数 3 求偏导 是得导函数为0 分离常数部分
  • Java 高精度计算 BigDecimal 和 BigInteger

    BigDecimal 在 Java 中 表示小数值一般使用 float 或者 double 类型 可以用于科学计算或者工程计算等 数学意义上的小数是连续的 但 float 和 double 只能表示其中的一些离散点 如果我们要表示的数值刚好
  • Webpack 中常用的loader和plugin已经webpack如何配置

    dist文件夹存放打包后的文件 动态获取出口路径 需要有webpack init 生成package js文件 1 1webpack是什么 webpack 是一种前端资源构建工具 一个静态模块打包器 modulebundler 在 webp
  • IEnumerable vs IEnumerator

    对对象的存储对每一种语言都很重要 例如C 中的Iterator C 中的IEnumerator Java中的Iterator等 C 所有的集合类都定义了一个叫iterator的数据成员 可以通过此对象实现对集合的traverse vecto
  • kafka权威指南中文版之三

    第三章kafka producer 向kafka写入消息 无论你将kafka作为一个消息队列 或者消息总线 还是一个数据存储平台 你都要通过生产者producer向kafka写入数据 通过消费者consumer读取kafka的数据 例如 一
  • 微信支付流程

    一 微信支付流程 APP用户点击进行支付 会向我们自己的订单服务发送请求 携带订单的相关信息 订单服务接收到请求之后需要保存订单 调用微信统一下单接口生成预支付订单 微信会返回预支付订单标识 订单服务会根据微信返回的标识生成带签名的支付信息
  • SQL 注入-盲注

    目录 一 什么时候用到盲注 二 盲注的优缺点 三 盲注的流程 四 盲注的分类 五 布尔盲注 5 1 原理以及什么时候使用布尔盲注 5 2 例如upload labs靶场中的Less 8 5 3 布尔盲注常用函数及定义 5 4 length
  • PyQt5 第一章 PyQt5简介和安装

    第一章 PyQt5简介和安装 零基础入门玩转 PyQt5 邀请码 LWskm3AS 1 1 PyQt5 简介 PyQt5是Digia的一套Qt5应用框架与python的结合 同时支持2 x和3 x Qt库由Riverbank Computi
  • 计算机与图像处理论文标题,数字图像处理论文各种题目.doc

    数字图像处理论文各种题目 待处理图片 参考最终效果图 29利用中值空间滤波去去除波形噪声 要求 掌握空间滤波原理 了解中值空间滤波在实际中的应用 利用MATLAB实现对波形的中值滤波 改进算子 使图像达到标准对照图像效果 待处理图片 处理后
  • webpack html 引入cdn,Webpack如何引入CDN连接来优化编译后的体积

    背景 在 Vue 项目中 引入到工程中的全部 js 文件 编译时都会被打包进 vendor js 也就致使了 vendor js 文件体积变得至关臃肿 必定程度上影响着页面的渲染 为了减小编译后的体积 提升页面渲染速度 咱们能够经过引入 C
  • python时间戳转换年,月,日,季度,周

    数据结构 def q year day week day dict 0 星期一 1 星期二 2 星期三 3 星期四 4 星期五 5 星期六 6 星期天 for x in range 0 366 time item star time int
  • github上传的报错的问题解决

    文章目录 前言 一 遇见的问题 二 开始配置ssh key 这就完成了 可以重新尝试一下上面代码到github 前言 有很多伙伴们在操作github时候 上传代码的时候 会有报错问题 上传代码失败 这里我给出我本人的的解决办法 一 遇见的问
  • Sakura美化

    文章原地址在 我的博客 接上次的文章 闲着也是闲着 不如搭个免费的博客玩玩 0 前言 做hexo的美化工作 主要是 修改布局文件 HTML模板ejs文件 添加功能 做好CSS 还是得对HTML 结构 CSS 表现 Javascript 行为
  • 【华为OD机试真题 Python】整理扑克牌 (A卷2022Q4)

    前言 本专栏将持续更新华为OD机试题目 并进行详细的分析与解答 包含完整的代码实现 希望可以帮助到正在努力的你 关于OD机试流程 面经 面试指导等 如有任何疑问 欢迎联系我 wechat steven moda email nansun09
  • python数据容器--集合的常用操作

    python数据容器 集合的常用操作 数据是无序存储的 不支持下标索引 不允许重复数据的存在 set集合基本操作 my set 传智教育 itheima 黑马程序员 添加新元素 my set add python print f 添加元素后
  • Mysql mysqldump备份数据

    mysqldump客户端实用程序执行逻辑备份 生成一组 SQL 语句 可以执行这些语句来重现原始数据库对象定义和表数据 它转储一个或多个 MySQL 数据库以进行备份或传输到另一台 SQL 服务器 mysqldump 命令还可以生成 CSV

随机推荐

  • C++实验一:简单数据及运算(解方程、海伦公式求三角形面积)

    实验目的 1 掌握C 中的基本数据类型的算术运算和逻辑运算 2 理解并掌握C 中运算符的优先级 3 掌握简单的类型转换方法 4 掌握C 的math头文件中常用的几种数学运算 5 了解visual studio的debug功能 并使用debu
  • Java动态代理代码编写

    Java动态代理代码编写 代理的概念 动态代理技术是整个java技术中最重要的一个技术 它是学习java框架的基础 不会动态代理技术 那么在学习Spring这些框架时是学不明白的 动态代理技术就是用来产生一个对象的代理对象的 在开发中为什么
  • 《AGIC学习之 LangChain获取电影信息》

    先获取 TMDB 的token https www themoviedb org settings api 申请API 应用URL是你的ip地址才行 应用简介要翻译为英文 import os os environ TMDB BEARER T
  • 企业电子招标采购系统源码Spring Cloud + Spring Boot + MybatisPlus + Redis + Layui + 前后端分离 + 二次开发

    功能描述 1 门户管理 所有用户可在门户页面查看所有的公告信息及相关的通知信息 主要板块包含 招标公告 非招标公告 系统通知 政策法规 2 立项管理 企业用户可对需要采购的项目进行立项申请 并提交审批 查看所有的立项信息 主要功能包含 招标
  • Ubuntu输入密码后无法进入桌面,但是可以进入命令行界面

    安装中文版的ubuntu经常会出现无法进入桌面的状况 这里给出我的解决方案 初步断定是Xwindows界面软件出问题了 所以重装即可 Solve 1 Ctrl Alt F1进入命令行界面 root账户登陆 Ctrl Alt F1进入命令行界
  • yum出现Error downloading packages错误

    yum出现Error downloading packages错误 错误表现方式 yum可以list 可以clean cache 但是无法安装 错误提示 Downloading packages Error downloading pack
  • Ubuntu上用网易云音乐乱码(亲测可用)

    使用Ubuntu听音乐的时候 播放列表总显示为乱码 这点非常不爽 于是上网搜索了下 终于找到了解决的办法 简单的方法就是将MP3标签转换为Unicode编码 要使用到python mutagen 在新立得软件管理中可以直接找到 也可以用以下
  • 让 Linux 应用随处运行,使用AppImage的方式安装软件!

    前言 大家好 我是小满同学 我是通过中国大学MOOC上的 零基础学Linux操作系统 这门课程入门了linux 学习和使用linux一年多 收获了很多 下面是关于linux下安装软件方式的一些分享 在课程中 我们了解到在linux平台下安装
  • 【含视频教程】python实现图书管理系统

    嗨嗨 大家好 我是小圆 今天给大家分享一下如何用python实现图书管理系统 手把手带你制作图书管理系统 文章末尾还有视频教程哦 话不多说马上开始吧 用户注册 def logon print 欢迎来到图书管理系统注册页面 username
  • jar包打包实践

    本文内容 1 不打包运行java应用程序 2 命令行打包的几种方式 3 非springboot项目如何使用springboot的打包方式 前言 作为java程序员 打包是一项基础性的技能 开发工具一般都集成了相应的打包功能 似乎不用我们投入
  • javaScript基础面试题 --- JS继承有哪些

    方法一 extends方法 在构造函数constructor中写super 必须的 class Parent constructor this age 18 class Child extends Parent constructor su
  • 宋浩概率论笔记(七)参数估计

    数一概率论大题的核心内容 关键是公式的背诵 需要特别重视
  • 几种获取本机IPv6地址的方法

    如同获取IPv4的地址一般 获取IPv6也是可以通过使用网卡信息来得到IPv6的地址 也可以给一个多播地址发送数据包然后获取IPv6的地址 在IPv4通过iotcl函数是可以获取本主机的IPv4的地址的 但是本楼主使用iotcl函数来获取I
  • Amazon——Elastic Compute Cloud(EC2)

    云计算 教材试读 弹性计算云EC2 4 3 弹性计算云EC2 亚马逊弹性计算云服务 Elastic Compute Cloud EC2 是亚马逊提供的云计算环境的基本平台 网络数据流的流向非常复杂 企业和个人的网络平台所需的计算能力也随着这
  • 老毛桃安装Linux系统ISO镜像,win7安装linux系统_老毛桃硬盘重装系统教程 - Win7之家...

    老毛桃一直都是在推广U盘启动制作器 但是最近白云看到了一个老毛桃硬盘安装器 所以小编就去试验了一番 现在给大家介绍一下老毛桃硬盘重装系统教程 虽然和一般硬盘安装器大相庭径 不过还是可以借鉴一番 下面就跟小编一起来看看吧 1 首先百度搜索老毛
  • 使用Python互转pdf文档和word文档

    1 前言 一日 欲将手头上的一份pdf文档转换成word文档 先试着用XX办公软件试了下 微信扫码登录后 在PDF转换界面 选中文档 点击 开始转换 弹出提示对话框 免费的只给转换5页文档 可我这文档要350页 全部转换需开通会员 有点懵逼
  • docker 安装 rabbitmq

    拉取rabbitmq镜像 docker pull rabbitmq 启动rabbit 并指定登录账号 密码 端口映射 docker run d name rabbitmq hostname my rabbit p 5672 5672 p 1
  • 操作系统读写者问题实验报告_大云制造

    友情提示 全文3000多文字 预计阅读时间10分钟 概述 大云企业操作系统 BC Linux BigCloud Enterprise Linux 是中移 苏州 软件技术有限公司借助开源社区优势 通过定制化手段研发的高性能 安全可靠 自主可控
  • react项目中引入typescript

    新建项目使用typescript 如果你是要新建一个使用typescript的react项目 并且你用脚手架Create React App去创建 那没就非常的容易 你只需要在创建的时候将命令改为 npx create react app
  • python abstractmethod_Python装饰器abstractmethod、property、classmethod、staticmethod及自定义装饰器...

    总览 abstractmethod 抽象方法 含abstractmethod方法的类不能实例化 继承了含abstractmethod方法的子类必须复写所有abstractmethod装饰的方法 未被装饰的可以不重写 property 方法伪