首页 文章 精选 留言 我的

精选列表

搜索[人设自定义],共10000篇文章
优秀的个人博客,低调大师

Python装饰器abstractmethod、property、classmethod、staticmethod及自定义装饰器

总览: @abstractmethod:抽象方法,含abstractmethod方法的类不能实例化,继承了含abstractmethod方法的子类必须复写所有abstractmethod装饰的方法,未被装饰的可以不重写 @ property:方法伪装属性,方法返回值及属性值,被装饰方法不能有参数,必须实例化后调用,类不能调用 @ classmethod:类方法,可以通过实例对象和类对象调用,被该函数修饰的方法第一个参数代表类本身常用cls,被修饰函数内可调用类属性,不能调用实例属性 @staticmethod:静态方法,可以通过实例对象和类对象调用,被装饰函数可无参数,被装饰函数内部通过类名.属性引用类属性或类方法,不能引用实例属性 案例讲解: @abstractmethod 用于程序接口的控制,正如上面的特性,含有@abstractmethod修饰的父类不能实例化,但是继承的子类必须实现@abstractmethod装饰的方法 #-*-coding:utf-8-*- fromabcimportABC,abstractmethodclassA(ABC): @abstractmethod deftest(self): passclassB(A): deftest_1(self): print("未覆盖父类abstractmethod")classC(A): deftest(self): print("覆盖父类abstractmethod")if__name__=='__main__': a=A() b=B() c=C() 前两个分别报错如下: a=A()TypeError:Can'tinstantiateabstractclassAwithabstractmethodstest b=B() TypeError:Can'tinstantiateabstractclassBwithabstractmethodstest 第三个实例化是正确的 @ property 将一个方法伪装成属性,被修饰的特性方法,内部可以实现处理逻辑,但对外提供统一的调用方式,实现一个实例属性的get,set,delete三种方法的内部逻辑,具体含义看示例code。 #-*-coding:utf-8-*-#-*-coding:utf-8-*-classData: def__init__(self): self.number=123 @property defoperation(self): returnself.number @operation.setter defoperation(self,number): self.number=number @operation.deleter defoperation(self): delself.number @ classmethod,staticmethod 类方法classmethod和静态方法staticmethod是为类操作准备,是将类的实例化和其方法解耦,可以在不实例化的前提下调用某些类方法。两者的区别可以这么理解:类方法是将类本身作为操作对象,而静态方法是独立于类的一个单独函数,只是寄存在一个类名下。类方法可以用过类属性的一些初始化操作。 #-*-coding:utf-8-*-classTest: num="aaaa" def__init__(self): self.number=123 @classmethod defa(cls,n): cls.num=n print(cls.num) @classmethod defb(cls,n): cls.a(n) @classmethod defc(cls,n): cls.number=n @staticmethod defd(n): Test.b(n) 分别通过类对象、实例化对象来调用 装饰器函数机制 谈装饰器的原理就不得不先理解Python的闭包,在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包即内部函数对外部函数作用域里变量的引用(非全局变量),则称内部函数为闭包。 装饰器是建立在闭包的基础上,将被装饰函数传入闭包函数中执行则形成了装饰器。 闭包: #-*-coding:utf-8-*-deftest(a): defadd(a): print(a+2) returnadd(a)if__name__=='__main__': test(2)2 装饰器原型: #-*-coding:utf-8-*- defB(fn): defb(): returnfn()+3 returnb@B defadd(): return3if__name__=='__main__': str=fn() print(str) ---------------- 6 当被装饰函数带参数: #-*-coding:utf-8-*-defB(fn): defb(*args,**kwargs): returnstr(fn(*args,**kwargs))+"装饰" returnb@Bdeffn(*args,**kwargs): num=0 foriinargs: num+=i foriinkwargs.values(): num+=i returnnumif__name__=='__main__': num=fn(1,2,3,a=4,b=5) print(num) ----------------15装饰 当装饰函数带额外参数,应该在装饰函数外再包裹一层函数 #-*-coding:utf-8-*-defA(n): defB(fn): defb(*args,**kwargs): returnn+str(fn(*args,**kwargs))+"装饰" returnb returnB@A("包裹前缀")deffn(*args,**kwargs): num=0 foriinargs: num+=i foriinkwargs.values(): num+=i returnnumif__name__=='__main__': num=fn(1,2,3,a=4,b=5) print(num) ---------------- 包裹前缀15装饰 当多个装饰函数装饰一个函数时的执行顺序 #-*-coding:utf-8-*-defA(fn): print(1) defrun(): print(2) fn() print('a') returnrundefB(fn): print(3) defrun(): print(4) fn() print('b') returnrundefC(fn): print(5) defrun(): print(6) fn() print('c') returnrun@A@B@Cdeftest(): print(7)if__name__=='__main__': test() ----------------5 c3 b1 a2467 由此可以得出多装饰情况下的运行情况:初始化运行从下到上,内部执行顺序从内到外。因为开始执行时会按照装饰顺序,组装成一个函数,而这个函数从最外层的return执行到最内层,故有上述顺序,就像剥洋葱一样。 类装饰器 #-*-coding:utf-8-*-classAdd: def__init__(self,fn): print("初始化") self.num=44 self.fn=fn def__call__(self,*args,**kwargs): print("类装饰器开始工作") returnself.fn(self.num) @Adddeftest(n): return4+nif__name__=='__main__': num=test() print(num) ---------------- 初始化 类装饰器开始工作48 类装饰器使用地方较少,核心是通过复写类的回调方法__call__. 装饰器应用场景 引入日志 函数执行时间统计 执行函数前预备处理 执行函数后清理功能 权限校验等场景 缓存

优秀的个人博客,低调大师

高自定义的小程序 UI 组件库 wuss-weapp

如何使用 方法一 [推荐] (通过npm安装依赖并在小程序构建npm模块) 通过使用shell命令或git定位到当前小程序开发目录,然后使用npm或者yarn安装依赖。npm install --production wuss-weapp 或者 yarn add --production wuss-weapp 当依赖安装完成后即可在微信小程序开发者工具里点击 [工具] => [构建npm],此时若出现弹窗则记得吧 “使用npm模块” 勾上,若无弹窗则待构建完成后在详情里面手动勾上 “使用npm模块”。 构建完成后即可添加需要的组件。在页面的 json 中配置: "usingComponents": { "w-button": "wuss-weapp/w-button/index" } 在 wxml 中使用组件:<w-button type="info" bind:click="buttonClick">这是一个按钮</w-button> 在JavaScript中使用:import { Alert, Toast } from 'wuss-weapp'; Alert({ title: '提示', content: 'wuss weapp is good', }); Toast.show({ message: 'wuss小程序UI库', }); 方法二(通过clone当前项目的dist拷贝到自己项目中使用) 到GitHub下载 Wuss Weapp 的代码,将dist目录拷贝到自己的项目中。然后按照如下的方式使用组件,以 Button 为例,其它组件在对应的文档页查看: 添加需要的组件。在页面的 json 中配置(路径根据自己项目位置配置): "usingComponents": { "w-button": "/dist/w-button/index" } 在 wxml 中使用组件:<w-button type="info" bind:click="buttonClick">这是一个按钮</w-button> 预览所有组件 我们内置了所有组件的示例,您可以扫描上方的的小程序码体验,或按以下方式在微信开发者工具中查看: git clone https://github.com/phonycode/wuss-weapp.git 然后,直接将项目在微信开发者工具中打开即可。 本文来自云栖社区合作伙伴“开源中国” 本文作者:达尔文 原文链接

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册