middleware中的super()构造方法问题

来源:8-5 通过downloadmiddleware随机更换user-agent - 2

Liangruuu

2018-11-26

class RandomUserAgentMiddlware(object):
    #随机更换user-agent
    def __init__(self, crawler):
        super(RandomUserAgentMiddlware, self).__init__()
        self.ua = UserAgent()
        self.ua_type = crawler.settings.get("RANDOM_UA_TYPE", "random")

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler)

    def process_request(self, request, spider):
        def get_ua():
            return getattr(self.ua, self.ua_type)

        request.headers.setdefault('User-Agent', get_ua())

老师,关于__init__里面的调用父类构造方法这行能不能去掉,因为我看scrapy源码里也都是没有使用过super(),我们这里调用super有什么意义吗,而且middleware的父类是什么,我好像没在他源码里看到过

写回答

1回答

bobby

2018-11-26

可以去掉, 如果你知道了super的定义之后其实你应该知道super方法是按照mro的算法去查找方法的, 在django的xadmin中出现过虽然继承的是object,但是xadmin会内部调整继承顺序,导致有些父类中的方法子类可以重用。所以为了保险起见这样调用不会有副作用,不过你这里不调用也可以

0
0

Scrapy打造搜索引擎 畅销4年的Python分布式爬虫课

带你彻底掌握Scrapy,用Django+Elasticsearch搭建搜索引擎

5796 学习 · 6290 问题

查看课程