python 类中装饰器
天蓬老师
天蓬老师 2017-04-17 15:03:10
[Python讨论组]

a = Question()
a.all_answer() 正常,结果打印到屏幕
但是我想 a.all_answer(write=True) 执行 if write == True:把结果写入文件

但 a.all_answer(True)报错:

TypeError: internal() takes exactly 1 argument (2 given)

a.all_answer(erite=True)也报错:
TypeError: internal() got multiple values for keyword argument 'write'

把装饰函数放到类中也一样。

def write_answer(pre=''):
    def wrapper(F):
        def internal(write):
             if write == True:
                 result = F(write)
                 with open('/path/a.txt', 'w') as f:
                    f.write(result)
             else:
                 print pre
                 F(write)
        return internal
    return wrapper


class Question(object):
    @write_answer('logging...')
    def all_answer(self, write=False):
        #下面代码部分直接忽略吧

        answer_number = self.answer_number()
        reg_img = r'http://pic3.zhimg.com/\w+\.jpg'
        if answer_number == 0:
            print "This question is no answers"
        else:
            re_br = re.compile(r'<br/?>')
            re_allmark = re.compile(r'<[^>]+>',re.S)
            all_answer_list = self.soup.find_all( 'p', 'zm-item-answer ') 
            for each in all_answer_list:
                print each.h3.get_text()  
                content = str(each.find('p', ' zm-editable-content clearfix')) 
                br2n = re.sub(re_br, '\n', content)
                for s in br2n.split('\n'):
                    print re.sub(re_allmark, '', s)
天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(1)
高洛峰

TypeError: internal() takes exactly 1 argument (2 given)

错误很明显了,internal实际效用的时候多传了一个参数。

为毛? 装饰类的方法时候,调用的方法还有一个 self 参数了。

因此,你的装饰器需要修改,补上self

def write_answer(pre=''):
    def wrapper(F):
        def internal(self, write):
            pass
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号