我正在为我的 Django 项目开发一个基本的 python 类子类系统,但我遇到了一个奇怪的问题。
首先,类的定义:
文件类.py
class BaseAd(object):
""" base class for all the ads, with common parameters """
def __init__(self, dom, web, loc, cc, a, c, date, desc, hl, **kwargs):
self.domain = self.doDomain(dom)
self.url = self.doUrl(web)
self.description = self.doDescription(desc, hl)
self.location = self.doLocation(a, c, loc)
self.date = self.doDate(date)
文件作业.py
class JobAd(BaseAd):
""" extends BaseAd with more parameters """
def __init__(self, domain, url, location, countrycode, area, city,
index_date, description,
contract_multivalue, salary_min, company, job_title, **kwargs):
self.contract_type = self.doContract(contract_multivalue)
self.salary = self.doSalary(salary_min)
self.company = self.doCompany(company)
self.title = self.doTitle(job_title)
""" Super constructor call """
super(JobAd, self).__init__(
domain,
url,
location,
countrycode,
area,
city,
index_date,
description,
**kwargs
)
这两个类都有各自的方法(域、doSalary 等),这些方法现在无关紧要,因为它们只是返回作为输入获得的字符串(将来会更好地实现,现在只是不需要)。kwargs 仅用于存储一些无用但仍返回原始 dict 的参数(否则我会收到错误消息)
JobAd 类用作我们的 python-to-solr 接口 sunburnt 的构造函数参数。在您定义一个类并将其传递给该方法后,它会将 solr 响应中定义的字段(它只是一个 dict)转换为该类。因此,在 JobAd 的 init 中定义的参数必须与它们在 solr 模式中的定义具有相同的名称。
这是实际的构造函数调用:
/path/to/myapp/resultsets/views_json.py in job_search_json
#lines splitted for better reading
#res is a solr search object
items = res.paginate(start=start, rows=res_per_page)
.sort_by("-index_date")
.sort_by("-score")
.sort_by("-md5")
.sort_by("-posted_date")
.execute(constructor=JobAd)
堆栈跟踪中的下一个是:
/path/to/sunburnt-0.6-py2.7.egg/sunburnt/search.py in execute
return self.transform_result(result, constructor)
...
▼ Local vars
Variable Value
self sunburnt.search.SolrSearch object at 0x7f8136e78450
result sunburnt.schema.SolrResponse object at 0x7f8136e783d0
constructor class 'myapp.models.jobs.JobAd'
最后
/path/to/sunburnt-0.6-py2.7.egg/sunburnt/search.py in transform_result
result.result.docs = [constructor(**d) for d in result.result.docs]
在最后一个“本地变量”选项卡中,有结果字典(只是结构,而不是带有值的完整字典):
self sunburnt.search.SolrSearch object at 0x7f8136e78450
d {'area':
'city':
'contract_multivalue':
'country':
'countrycode':
'currency':
'description':
'district':
'domain':
'fileName':
'index_date':
'job_experience':
'job_field_multivalue':
'job_position_multivalue':
'job_title':
'job_title_fac':
'latitude':
'location':
'longitude':
'md5':
'salary_max':
'salary_min':
'study':
'url':
'urlPage':
}
constructor class 'tothego_frontend.sito_maynard.models.jobs.JobAd'
在 django.log 文件中,没有其他错误,除了 DogSlow 陷阱只告诉被困行。
这是我得到的错误:
TypeError at /jobs/us/search/
__init__() takes exactly 13 arguments (12 given)
我期望的行为不是我实际遇到的行为:我的类没有调用其父类的构造函数(10 个参数),而是使用自己的 init(14 个参数)。
我也一直在尝试使用旧的 python 类定义:超类中没有“对象”;在子类的 init 中,父类被初始化为 BaseAd。初始化(自我,...);我也一直在尝试将超级方法称为子类 init(a la java)中的第一条语句,但似乎没有任何改变。
我在这里做错了什么?
编辑:我固定了第二个初始化行的长度,有点太多了!
来自 DJANGO 的堆栈跟踪的附加信息
最新技术:我开始假设 sunburnt 不支持类继承,即使文档中没有关于它的内容。
新编辑:经过今天的一些测试,这就是我发现的(到目前为止)
- 晒伤允许继承
- 我有 3 个参数不同步,更新了代码和错误
现在它总是缺少一个论点。也许是“自我”?我真的不知道在哪里看,错误和以前一样(相同的堆栈跟踪)只是不同的错误参数。
实际上发现了问题,向 init 参数添加一些默认值帮助我发现了真正的错误:输入中缺少字段。对不起,你们浪费了你们的时间,再次感谢你们的咨询