【发布时间】:2015-02-24 05:24:19
【问题描述】:
在 Javascript 中,有多种方法可以实现方法的继承。 下面是一个使用几种方法的混合示例:
A = {
name: 'first',
wiggle: function() { return this.name + " is wiggling" },
shake: function() { return this.name + " is shaking" }
}
B = Object.create(A)
B.name = 'second'
B.bop = function() { return this.name + ' is bopping' }
C = function(name) {
obj = Object.create(B)
obj.name = name
obj.crunk = function() { return this.name + ' is crunking'}
return obj
}
final = new C('third')
这给了我以下继承层次结构。
需要注意的重要事项之一是每个对象的name 属性。当运行一个方法时,即使是原型链的最底层,this 关键字定义的本地上下文确保使用 localmost 属性/变量。
我最近转向 Python,但我无法理解子类如何访问超类方法,以及变量范围/对象属性如何工作。
我在 Scrapy 中创建了一个 Spider(非常成功),它在单个域上抓取了 2000 多个页面并将它们解析为我需要的格式。许多助手只在主要的parse_response 方法中起作用,我可以直接在数据上使用它。原来的蜘蛛看起来像这样:
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from spider_scrape.items import SpiderItems
class ScrapeSpider(CrawlSpider):
name = "myspider"
allowed_domains = ["domain.com.au"]
start_urls = ['https://www.domain.com.au/']
rules = (Rule(SgmlLinkExtractor(allow=()),
callback="parse_items",
follow=True), )
def parse_items(self, response):
...
回调函数 parse_items 包含为我处理响应的逻辑。当我概括所有内容时,我得到了以下结果(打算在多个域上使用它):
#Base
class BaseSpider(CrawlSpider):
"""Base set of configuration rules and helper methods"""
rules = (Rule(LinkExtractor(allow=()),
callback="parse_response",
follow=True),)
def parse_response(self, response):
...
def clean_urls(string):
"""remove absolute URL's from hrefs, if URL is form an external domain do nothing"""
for domain in allowed_domains:
string = string.replace('http://' + domain, '')
string = string.replace('https://' + domain, '')
if 'http' not in string:
string = "/custom/files" + string
return string
#Specific for each domain I want to crawl
class DomainSpider(BaseSpider):
name = 'Domain'
allowed_domains = ['Domain.org.au']
start_urls = ['http://www.Domain.org.au/'
,'http://www.Domain.org.au/1']
当我通过 Scrapy 命令行运行它时,我在控制台中出现以下错误:
经过一些测试,将列表理解更改为此使其工作:for domain in self.allowed_domains:
一切都好,这似乎与 Javascript 中的 this 关键字非常相似——我正在使用对象的属性来获取值。还有更多的变量/属性可以保存抓取所需的 XPath 表达式:
class DomainSpider(BaseSpider):
name = 'Domain'
page_title = '//title'
page_content = '//div[@class="main-content"]'
更改 Spider 的其他部分以模仿 allowed_domains 变量的部分,我收到此错误:
我尝试以几种不同的方式设置属性,包括使用 self.page_content 和/或 __init__(self) 构造函数,但没有成功但出现不同的错误。
我完全不知道这里发生了什么。我期望发生的行为是:
- 当我从终端运行
scrapy crawl <spider name>时,它会实例化 DomainSpider 类 - 该类中的任何类常量都可用于其继承的所有方法,类似于 Javascript 及其
this关键字 - 由于上下文,其超类中的任何类常量都会被忽略。
如果有人可以
- 向我解释以上内容
- 向我指出比 LPTHW 更丰富的东西,而不是 Python 的 TDD,这将是惊人的。
提前致谢。
【问题讨论】:
-
Python 不是 JavaScript。你读过教程的Section 9 吗?我想在 pyvideo.org 上有一些视频可能会有所启发......pyvideo.org/video/1779/pythons-class-development-toolkit,pyvideo.org/video/879/the-art-of-subclassing,pyvideo.org/video/880/stop-writing-classes,pyvideo.org/video/1079/a-deep-dive-into-python-classes
-
如果您想了解 Python 中属性的工作原理,我建议您从使用“玩具”类的简单示例开始,而不是使用 Scrapy 作为示例。一旦你理解了这些概念,你就会更轻松地处理 Scrapy 正在做的任何事情。浏览the Python tutorial,也许还有其他一些问题,您可以通过谷歌搜索“Python 类和实例变量/属性”找到网页,例如this one。
标签: python python-2.7 inheritance methods scrapy