牛骨文教育服务平台(让学习变的简单)
博文笔记

python中用函数初始化类变量

创建时间:2012-05-11 投稿人: 浏览次数:8299

今天在写python的时候遇到一个问题:定义了一个list类型的类变量,但是这个list需要在初始化的时候给它加很多的url进去.这样的话我们就需要用倒函数了.结果自己刚开始这样写的:

class TianyaSpider(CrawlSpider):

def init_start():
        url_l = u"http://search.tianya.cn/s?tn=sty&rn=10&pn="
        url_r = u"&s=0&pid=&f=0&h=1&ma=0&q=%B8%DF%BF%BC%D6%BE%D4%B8"
        urls = []
        for i in range(0,75,1):
            tem = url_l + str(i) + url_r
            urls.append(tem)
        return urls


    name = "tianya"
    allowed_domains = ["tianya.cn"]
    start_urls = init_start()


这样写是成功了,但是总感觉不规范,如果你把函数的定义写在后面那么程序还无法识别该函数.其实我觉得这和java等是一个道理,这个方法中的代码是放在static区的.在第一次加载这个类的时候,这些代码便放了进去.这样的函数好像是不太方便在类的外部去调用的.所以这样做在python中无疑是不规范的,那么我就想换一种表达的方式


刚开始我一直想在类定义的内部去调用类函数来进行该类变量的初始化,所以代码变成下面这个样子:

 # -*- coding: utf-8 -*-
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from GaoKao.items import GaokaoItem

class TianyaSpider(CrawlSpider):
    name = "tianya"
    allowed_domains = ["tianya.cn"]
    start_urls = TianyaSpider.init_start()

    count = 0
    
    
    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        self.count = self.count + 1
        #title = hxs.select("//div[@id="post-title"][@class="fn-clear"]/h1[@id="hTitle"]//*/text()").extract()
        title = hxs.select("//title/text()").extract()
        item = GaokaoItem()
        item["title"] = title[0]
        
        yield item
    @classmethod
    def init_start(cls):
        url_l = u"http://search.tianya.cn/s?tn=sty&rn=10&pn="
        url_r = u"&s=0&pid=&f=0&h=1&ma=0&q=%B8%DF%BF%BC%D6%BE%D4%B8"
        urls = []
        for i in range(0,75,1):
            tem = url_l + str(i) + url_r
            urls.append(tem)
        return urls
        
    
            
   
但是报错说TinayaSpider没有定义,你了个妹的,估计是当成对象了,接着我又这样做:

 # -*- coding: utf-8 -*-
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from GaoKao.items import GaokaoItem

class TianyaSpider(CrawlSpider):
    @classmethod
    def init_start(cls):
        url_l = u"http://search.tianya.cn/s?tn=sty&rn=10&pn="
        url_r = u"&s=0&pid=&f=0&h=1&ma=0&q=%B8%DF%BF%BC%D6%BE%D4%B8"
        urls = []
        for i in range(0,75,1):
            tem = url_l + str(i) + url_r
            urls.append(tem)
        return urls
    name = "tianya"
    allowed_domains = ["tianya.cn"]
    start_urls = init_start()

    count = 0
    
    
    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        self.count = self.count + 1
        #title = hxs.select("//div[@id="post-title"][@class="fn-clear"]/h1[@id="hTitle"]//*/text()").extract()
        title = hxs.select("//title/text()").extract()
        item = GaokaoItem()
        item["title"] = title[0]
        
        yield item
    
        
    
            
   
但是还是报错说不能调用该类方法.

至今不知道在这里怎么去调用类方法来进行初始化.

但是我一想,我可以通过实例方法来改变.所以我把代码的结构一改,换成如下:

 # -*- coding: utf-8 -*-
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from GaoKao.items import GaokaoItem

class TianyaSpider(CrawlSpider):
    def init_start(cls):
        url_l = u"http://search.tianya.cn/s?tn=sty&rn=10&pn="
        url_r = u"&s=0&pid=&f=0&h=1&ma=0&q=%B8%DF%BF%BC%D6%BE%D4%B8"
        urls = []
        for i in range(0,75,1):
            tem = url_l + str(i) + url_r
            urls.append(tem)
        return urls
    name = "tianya"
    allowed_domains = ["tianya.cn"]
    start_urls = []
    count = 0
    
    def __init__(self):
        CrawlSpider.__init__(self)
        TianyaSpider.start_urls = self.init_start()
    
    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        self.count = self.count + 1
        #title = hxs.select("//div[@id="post-title"][@class="fn-clear"]/h1[@id="hTitle"]//*/text()").extract()
        title = hxs.select("//title/text()").extract()
        item = GaokaoItem()
        item["title"] = title[0]
        
        yield item
        
    def init_start(self):
        url_l = u"http://search.tianya.cn/s?tn=sty&rn=10&pn="
        url_r = u"&s=0&pid=&f=0&h=1&ma=0&q=%B8%DF%BF%BC%D6%BE%D4%B8"
        urls = []
        for i in range(0,75,1):
            tem = url_l + str(i) + url_r
            urls.append(tem)
        return urls
        
    
            
   
这样便成功了.不知道为什么这里就识别除了tinayaspider了


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。