- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在 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
每个对象的属性。当运行一个方法时,即使在原型(prototype)链的最下游,由 this
定义的本地上下文关键字确保使用 localmost 属性/变量。
我最近转向使用 Python,但我无法理解子类如何访问父类(super class)方法,以及变量作用域/对象属性如何工作。
我在 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:
很好,这看起来与 this
非常相似Javascript 中的关键字 - 我使用对象的属性来获取值。还有更多的变量/属性将保存抓取所需的 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 类this
关键词如果有人能
提前致谢。
最佳答案
我不熟悉 JavaScript,但与您的问题类似的问题总是包含一个答案,表明您必须学习使用 Python 的方法,而不是试图强制 Python 像您的其他语言。尝试在 Python 中重新创建您的 Javascript 风格,我想到了这个:
class A(object):
def __init__(self):
self.name = 'first'
def wiggle(self):
return self.name + ' is wiggling'
def shake(self):
return self.name + ' is shaking'
创建 A
的实例,更改其名称并添加方法属性到实例
b = A()
b.name = 'second'
b.bop = lambda : b.name + ' is bopping'
返回 A
实例的函数,带有附加属性 crunk
。我不认为你的例子是这样,thing
不会有 bop
方法,尽管函数中的另一个语句可以添加一个。
def c(name):
thing = A()
thing.name = name
thing.crunk = lambda : thing.name + ' is crunking'
return thing
final = c('third')
没有任何继承正在进行,只有 A
的实例具有额外的属性。您得到以下结果:
>>>
>>> b.name
'second'
>>> b.bop()
'second is bopping'
>>> b.shake()
'second is shaking'
>>> b.wiggle()
'second is wiggling'
>>>
>>> final.name
'third'
>>> final.crunk()
'third is crunking'
>>> final.shake()
'third is shaking'
>>> final.wiggle()
'third is wiggling'
>>> final.bop()
Traceback (most recent call last):
File "<pyshell#32>", line 1, in <module>
final.bop()
AttributeError: 'A' object has no attribute 'bop'
>>>
在 Python 中你会这样做:
A
类具有 name
属性的默认参数和两个将绑定(bind)到 A
实例的方法。 name
是一个instance 属性,因为它是在__init__
中定义的。 A
的 instances 将具有 name
属性 - A.name
将引发 AttributeError。
class A(object):
def __init__(self, name = 'first'):
self.name = name
def wiggle(self):
return self.name + ' is wiggling'
def shake(self):
return self.name + ' is shaking'
Foo
继承了 A
的所有内容并定义了一个附加属性 bop
。
class Foo(A):
def bop(self):
return self.name + ' is bopping'
Bar
继承了 Foo
的所有内容并定义了一个附加属性 crunk
class Bar(Foo):
def crunk(self):
return self.name + ' is crunking'
Baz
继承了 Bar
的所有内容并覆盖了 wiggle
class Baz(Bar):
def wiggle(self):
return 'This Baz instance, ' + self.name + ', is wiggling'
foo = Foo('second')
bar = Bar('third')
baz = Baz('fourth')
用法:
>>>
>>> foo.name
'second'
>>> foo.bop()
'second is bopping'
>>> foo.shake()
'second is shaking'
>>> foo.wiggle()
'second is wiggling'
>>>
>>> bar.name
'third'
>>> bar.bop()
'third is bopping'
>>> bar.shake()
'third is shaking'
>>> bar.wiggle()
'third is wiggling'
>>> bar.crunk()
'third is crunking'
>>>
>>> baz.wiggle()
'This Baz instance, fourth, is wiggling'
>>>
这些示例中的类具有仅对类实例有效的方法属性 - 方法需要绑定(bind)到实例。我没有包含任何不需要绑定(bind)到实例的类方法或静态方法的示例 - What is the difference between @staticmethod and @classmethod in Python? 有一些很好的答案
>>> A.wiggle
<unbound method A.wiggle>
>>> A.wiggle()
Traceback (most recent call last):
File "<pyshell#41>", line 1, in <module>
A.wiggle()
TypeError: unbound method wiggle() must be called with A instance as first argument (got nothing instead)
>>> Bar.crunk
<unbound method Bar.crunk>
>>> Bar.crunk()
Traceback (most recent call last):
File "<pyshell#43>", line 1, in <module>
Bar.crunk()
TypeError: unbound method crunk() must be called with Bar instance as first argument (got nothing instead)
>>>
关于python - 从 Javascript 到 Python - 了解类、方法和属性的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27664912/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!