草庐IT

类装饰器

isDaHua 2023-04-16 原文

2022-09-18

 类装饰器的定义:

  使用一个类作为一个装饰器,在类里面对已有函数添加其他功能。

类装饰器使用的一个实例:

 1 class MyDecorator(object):
 2     def __init__(self,func):
 3         self.__func = func
 4 
 5     def __call__(self, *args, **kwargs):
 6         print("课已讲完")
 7         self.__func()
 8 
 9 @MyDecorator
10 def show():
11     print("快要下课啦")
12 
13 show()

  说明:

    第10-11行,原来的函数

    第1-7行,定义了一个类装饰器,为原来的函数添加其他功能。注意:如果此时是类作为装饰器的话,之前装饰器中传入的函数现在应该放在的位置在“__init__”构造函数中。

    第3行,为了在下面的代码中调用func函数,所以此处要将传入的"func"参数作为一个属性。“self.__func”,在func前面加了两个下划线表示将该func属性作为一个私有属性。

    第5行,为了在下面函数调用中直接使用类对象名调用,使用此处要使用“__call__”,它的目的是将对象作为一个可调用的对象。

    第6行,增加的新的功能。

    第7行,调用“__func()”函数,注意,此处调用的是一个函数,而非上面的属性,因此要加上括号。因为是在类的内部调用的本类传入的参数,所以要使用“self”。

    第9行,类装饰器语法糖,表示给原来的函数增加新的功能。

运行结果图:

 

有关类装饰器的更多相关文章

  1. ruby-on-rails - Spree 模块装饰器 - 2

    我正在为我的在线商店使用SpreeCommerce。我想在结帐过程中更改一些行为,这些行为在spreegem内的app/models/spree/order/checkout.rb中定义。所以我在我的应用程序中的同一点创建了一个checkout_decorator.rb。问题是,我的更改没有加载。另一个问题是,模块内的所有内容都在一个方法内,即defself.included(klass)方法。所以我想我必须覆盖整个文件,而不是只覆盖一种方法。这是我的装饰器的样子:checkout_decorator.rbSpree::Order::Checkout.module_evaldodefs

  2. ruby - 在将字符串写入日志文件之前从字符串中删除颜色装饰 - 2

    我这样使用ruby​​记录器:$logger=Logger.newMultiIO.new($stdout,log_file)MultiIO是我从thisanswer得到的一个类.这在大多数情况下效果很好,但我正在使用'colored'ruby​​gem在终端上提供彩色输出。不幸的是,这也最终出现在日志文件中,因为ANSI转义看起来像[32mPASS[0m或一些类似的不可打印字符垃圾。清理日志文件字符串同时保持tty字符串颜色的最佳方法是什么?我不介意猴子修补Logger或MultiIO,但我绝对不希望对日志文件和屏幕进行两次不同的调用。 最佳答案

  3. python - Ruby 中的装饰器(从 Python 迁移) - 2

    我今天从Python的角度学习Ruby。我完全没能解决的一件事是装饰器的等价物。为了精简内容,我尝试复制一个简单的Python装饰器:#!/usr/bin/envpythonimportmathdefdocument(f):defwrap(x):print"Iamgoingtosquare",xf(x)returnwrap@documentdefsquare(x):printmath.pow(x,2)square(5)运行这个给我:Iamgoingtosquare525.0因此,我想创建一个函数square(x),但要对其进行装饰,以便它在执行之前提醒我它要对什么进行平方。让我们去掉糖

  4. javascript - 如何使用 Angular 的装饰器模式来增强指令的链接功能? - 2

    我正在研究Angular库并寻找一种使用装饰器模式扩展指令的方法:angular.module('myApp',[]).decorator('originaldirectiveDirective',['$delegate',function($delegate){varoriginalLinkFn;originalLinkFn=$delegate[0].link;return$delegate;}]);使用此模式扩充原始指令的最佳方式是什么?(示例用法:在不直接修改其代码的情况下对指令进行额外的监视或额外的事件监听器)。 最佳答案

  5. javascript - 装饰器在 Nest Controller 中返回 404 - 2

    我正在使用NestJS开发后端(顺便说一句,这太棒了)。我有一个“标准获取实体情况的单个实例”,类似于下面的示例。@Controller('user')exportclassUserController{constructor(privatereadonlyuserService:UserService){}......@Get(':id')asyncfindOneById(@Param()params):Promise{returnuserService.findOneById(params.id);}这非常简单并且有效-但是,如果用户不存在,服务将返回未定义并且Controller

  6. javascript - 带有 React 组件的装饰器 - 2

    我对能够使用@myDecorator语法(使用babel)感到非常兴奋。我正在尝试装饰生命周期函数之一,特别是componentWillMount,并检查装饰器中组件的props和context。但是,我似乎无法访问props或context。我不确定这是否是一种反模式,或者我只是在做这个错误。小例子://TestComponent.jsximportcheckPropsfrom'checkProps.js';classTestComponentextendsReact.Component{@checkPropscomponentWillMount(){//Dosomething.}r

  7. javascript - Angular - 在方法开始和结束时触发 console.log() 的自定义方法装饰器 - 2

    我想知道是否可以在Angular中创建自定义装饰器,将其应用于方法时可以实现以下功能:方法开始时的控制台日志方法结束时的控制台日志例子:没有装饰器:getRelationshipSource(){console.log('EnteringgetRelationshipSourcemethod');this.referenceDataService.getRefData('RLNSHPSC').subscribe(res=>{this.relationshipSource$.next(res);});console.log('LeavinggetRelationshipSourcemet

  8. javascript - 静态方法在 ES6 类中未定义,在 reactjs 中带有装饰器 - 2

    我有一个带有装饰器的ES6类。它有一个静态方法foo。但是,当我尝试访问静态方法时,它是未定义的。@withStyles(styles)classMyComponentextendsComponent{staticfoo(){return"FOO";}render(){varx=MyComponent.foo;//x=undefined}}当我删除装饰器时,我可以访问静态方法。它不再是未定义的。classMyComponentextendsComponent{staticfoo(){return"FOO";}render(){varx=MyComponent.foo;//x=foo()

  9. javascript - 如何将带有装饰器的 React 组件重写为纯函数? - 2

    我正在使用airbnbeslint设置,其中有arulethatenforcesstatelessreactcomponentstoberewrittenasapurefunction.下面的组件触发这个规则,这意味着下面的组件最好写成纯函数:importReactfrom'react';import{observer}from'mobx-react';importcssmodulesfrom'react-css-modules';importstylesfrom'./index.css';importSelectfrom'../Select/';importListfrom'../L

  10. javascript - 如何访问装饰器中的 ngStyle 键和值? - 2

    我的应用程序中有一个颜色名称列表。letcolours={mango:'#e59c09',midnight:'#1476a0'};我想扩展ngStyle指令以便能够理解我的自定义颜色名称。我正在通过decorating进行此操作ngStyle指令。然而,我在装饰器的编译函数上遇到了一场艰苦的战斗。我可以访问元素的ngStyle属性,但它以字符串形式出现(可以理解)。JSON.parse()对其不起作用,因为由于绑定(bind)一次等原因,它并不总是有效的JSON字符串...我只是想介入,遍历所有样式键,如果它包含color,我想检查值-如果它是上述自定义之一,则用十六进制替换颜色。我似

随机推荐