我知道有类似的问题,但我的情况有些不同:参考代码:

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 – 如何在类中使用装饰器相关推荐

  1. python生成器和装饰器_python三大法器:生成器、装饰器、迭代器

    迭代器 迭代的概念 使用for循环遍历取值的过程叫做迭代,比如:使用for循环遍历列表获取值的过程 使用for循环遍历取值的对象叫做可迭代对象, 比如:列表.元组.字典.集合.range.字符串 判断 ...

  2. python进阶装饰器_Python进阶: 通过实例详解装饰器(附代码)

    Python中的装饰器有很多用处,比如输出日志.参数检查.代理设置.计数计时.结果缓存等等.本文就通过几个装饰器例子,详细解释一下Python中装饰器的用法.一步步从简到繁学习装饰器用法 其他一些装饰 ...

  3. python面试装饰器_Python测开面试题之装饰器

    Python的装饰器是面试常被问到的问题之一,在面试Python测试开发时被问到的概率不低于70%,那么装饰器的原理是什么,怎么快速写出一个装饰器呢,接下来我们详细讲解装饰器的实现方法. Python ...

  4. 装饰器的注意事项python_python中的装饰器decorator

    python中的装饰器 装饰器是为了解决以下描述的问题而产生的方法 我们在已有的函数代码的基础上,想要动态的为这个函数增加功能而又不改变原函数的代码 例如有三个函数: deff1(x):returnx ...

  5. java类包装器有什么用_Java中的包装器类

    java类包装器有什么用 Wrapper class in java are the Object representation of eight primitive types in java. A ...

  6. python敏感词过滤代码简单代码_Python 实现王者荣耀中的敏感词过滤示例

    Python 实现王者荣耀中的敏感词过滤示例 王者荣耀的火爆就不用说了,但是一局中总会有那么几个挂机的,总能看到有些人在骂人,我们发现,当你输入一些常见的辱骂性词汇时,系统会自动将该词变成" ...

  7. python列表同时添加多个元素_python怎么向列表中添加多个元素

    python的列表是多变灵活的数据结构,向列表中添加元素,可以使用append()方法,或者extend()方法,还可使用insert()方法.insert() 主要用来插入元素,当向列表末尾添加元素 ...

  8. c#中索引器是什么_C#中的索引器

    c#中索引器是什么 An Indexer is a special feature of C# to use an object as an array. If you define an index ...

  9. tableau获取筛选器值_认识Tableau中的筛选器

    Tableau中的筛选器: (1)提取筛选器(2)数据源筛选器(3)上下文筛选器(4)维度筛选器(5)度量筛选器(6)参数筛选器(7)表计算筛选器(8)页面筛选器 对筛选器进行简单的分类: 数据层(提 ...

最新文章

  1. 【CVPR2020来啦】不容错过的29个教程Tutorial !(附Slides下载链接)
  2. 对话式AI 2019年遇来的新市场
  3. 体验Office 2013预览版
  4. android 校讯通 源码,校讯通Android版使用说明.doc
  5. 【数理知识】《数值分析》李庆扬老师-第8章-矩阵特征值计算
  6. 双NameNode的同步机制
  7. HTTP协议SSL协议HTTPS协议
  8. python 操作mongo
  9. Linux网络协议栈(一)——Socket入门(1)
  10. MongoDB插入文档
  11. 2020 年百度之星·程序设计大赛 - 初赛一
  12. 完整计算器java代码_计算器java代码
  13. linux shell脚本教程
  14. 故障树手册(Fault Tree handbook)(3)
  15. ChucK学习笔记(一)——下载与安装
  16. 教你用三种方式打造一款简单的网络播放器
  17. yarn安装插件报错: An unexpected error occurred: “https://registry.npmjs.org/vue-router: connect ETIMEDOUT
  18. 微信自动回复(新年快乐)
  19. 【Python4CFD】笔记step9-12
  20. 粘贴板管理 android,安卓剪贴板管理(Clipper Plus)

热门文章

  1. UVA10730 POJ1868 ZOJ2383 Antiarithmetic?【序列处理】
  2. HDU2000 ASCII码排序【字符串排序】
  3. I00028 整数逆序
  4. 非递归求解N皇后问题(回溯法)
  5. 代码健壮性的获得 —— 借助编译器及语言的语法特性
  6. 【物理/数学】概念的理解 —— pivot、position
  7. matlab 运行 AlexNet
  8. 面向对象特性、使用面向对象编程的场合
  9. 谷歌浏览器 —— 快捷键(vimium:像使用 vim 一样操作当前页面)
  10. OpenCV2 图像处理与计算机视觉(一)—— 去除一幅二值化图像中的椒盐噪声