python在类内部使用装饰器_python – 如何在类中使用装饰器
我知道有类似的问题,但我的情况有些不同:参考代码:
class MyClass(object):
def __init__(self, log_location)
self.logs = logging(log_location) # create log object by the log_location, this object should be used by the decorator fucntion
def record_log(log_object):
""" this is the decorator function
"""
def deco(func):
def wrap(*args, **kwargs):
rs = func()
# use log object to record log
if rs:
log_object.record('success')
else:
log_object.record('fail')
return wrap
return deco
@record_log(self.logs)
def test(self):
rs = do_some_thing
if rs:
return True
return False
def main():
my_class = MyClass()
my_class.test()
但是,有这样的错误:
@record_log(self.logs)
NameError: name 'self' is not defined
我应该在这样的场景中使用装饰器函数中的实例属性self.logs吗?
非常感谢!
最佳答案 您的代码有几个异议:
> deco()是多余的.您可以直接从record_log()返回换行.
>如果您只打算装饰MyClass的方法,那么将log_object传递给装饰器是没有意义的,因为将始终使用self.logs.否则,考虑将装饰器移动到模块级别,如其他人已经建议的那样.
>装饰方法的返回值当前丢失.
>对装饰函数的调用不会将self传递给它.
因此,正确的代码是:
class MyClass(object):
def __init__(self, log_location):
self.logs = logging(log_location)
def record_log(func):
""" this is the decorator function
"""
def wrap(self):
rs = func(self)
# use log object to record log
if rs:
print 1
self.logs.record('success')
else:
print 2
self.logs.record('fail')
return rs
return wrap
@record_log
def test(self):
rs = do_some_thing
if rs:
return True
return False
python在类内部使用装饰器_python – 如何在类中使用装饰器相关推荐
- python生成器和装饰器_python三大法器:生成器、装饰器、迭代器
迭代器 迭代的概念 使用for循环遍历取值的过程叫做迭代,比如:使用for循环遍历列表获取值的过程 使用for循环遍历取值的对象叫做可迭代对象, 比如:列表.元组.字典.集合.range.字符串 判断 ...
- python进阶装饰器_Python进阶: 通过实例详解装饰器(附代码)
Python中的装饰器有很多用处,比如输出日志.参数检查.代理设置.计数计时.结果缓存等等.本文就通过几个装饰器例子,详细解释一下Python中装饰器的用法.一步步从简到繁学习装饰器用法 其他一些装饰 ...
- python面试装饰器_Python测开面试题之装饰器
Python的装饰器是面试常被问到的问题之一,在面试Python测试开发时被问到的概率不低于70%,那么装饰器的原理是什么,怎么快速写出一个装饰器呢,接下来我们详细讲解装饰器的实现方法. Python ...
- 装饰器的注意事项python_python中的装饰器decorator
python中的装饰器 装饰器是为了解决以下描述的问题而产生的方法 我们在已有的函数代码的基础上,想要动态的为这个函数增加功能而又不改变原函数的代码 例如有三个函数: deff1(x):returnx ...
- java类包装器有什么用_Java中的包装器类
java类包装器有什么用 Wrapper class in java are the Object representation of eight primitive types in java. A ...
- python敏感词过滤代码简单代码_Python 实现王者荣耀中的敏感词过滤示例
Python 实现王者荣耀中的敏感词过滤示例 王者荣耀的火爆就不用说了,但是一局中总会有那么几个挂机的,总能看到有些人在骂人,我们发现,当你输入一些常见的辱骂性词汇时,系统会自动将该词变成" ...
- python列表同时添加多个元素_python怎么向列表中添加多个元素
python的列表是多变灵活的数据结构,向列表中添加元素,可以使用append()方法,或者extend()方法,还可使用insert()方法.insert() 主要用来插入元素,当向列表末尾添加元素 ...
- c#中索引器是什么_C#中的索引器
c#中索引器是什么 An Indexer is a special feature of C# to use an object as an array. If you define an index ...
- tableau获取筛选器值_认识Tableau中的筛选器
Tableau中的筛选器: (1)提取筛选器(2)数据源筛选器(3)上下文筛选器(4)维度筛选器(5)度量筛选器(6)参数筛选器(7)表计算筛选器(8)页面筛选器 对筛选器进行简单的分类: 数据层(提 ...
最新文章
- 【CVPR2020来啦】不容错过的29个教程Tutorial !(附Slides下载链接)
- 对话式AI 2019年遇来的新市场
- 体验Office 2013预览版
- android 校讯通 源码,校讯通Android版使用说明.doc
- 【数理知识】《数值分析》李庆扬老师-第8章-矩阵特征值计算
- 双NameNode的同步机制
- HTTP协议SSL协议HTTPS协议
- python 操作mongo
- Linux网络协议栈(一)——Socket入门(1)
- MongoDB插入文档
- 2020 年百度之星·程序设计大赛 - 初赛一
- 完整计算器java代码_计算器java代码
- linux shell脚本教程
- 故障树手册(Fault Tree handbook)(3)
- ChucK学习笔记(一)——下载与安装
- 教你用三种方式打造一款简单的网络播放器
- yarn安装插件报错: An unexpected error occurred: “https://registry.npmjs.org/vue-router: connect ETIMEDOUT
- 微信自动回复(新年快乐)
- 【Python4CFD】笔记step9-12
- 粘贴板管理 android,安卓剪贴板管理(Clipper Plus)