python中用函数初始化类变量

今天在写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了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值