gpt4 book ai didi

Python继承: init is having an issue with the number of params

转载 作者:太空宇宙 更新时间:2023-11-03 19:17:18 25 4
gpt4 key购买 nike

我正在为我的 Django 项目开发一个基本的 python 类-子类系统,但我遇到了一个奇怪的问题。

首先,类的定义:

文件classes.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)

文件 jobs.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
)

这两个类都有各自的方法(doDomain、doSalary 等),这些方法现在无关紧要,因为它们只是返回作为输入获得的字符串(将来会更好地实现,现在只是不需要)。 kwargs只是用来存储一些无用但仍然返回原始字典的参数(否则我会得到一个错误)

JobAd 类用作我们的 python-to-solr 接口(interface)的构造函数参数 sunburnt 。定义一个类并将其传递给该方法后,它将 solr 响应(只是一个字典)中定义的字段转换为该类。因此,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类定义:父类(super class)中没有“对象”;在子类的init内部,父类被初始化为BaseAd.init(self,...);我也一直在尝试调用 super 方法作为子类 init (a la java)中的第一个语句,但似乎没有任何改变。

我在这里做错了什么?

编辑:我修复了第二个初始化行的长度,有点太多了!

根据要求添加了 DJANGO 的堆栈跟踪信息

最新观点:我开始假设 sunburnt 不支持类继承,即使文档中没有任何相关内容。

新编辑:经过今天的一些测试,这是我发现的(到目前为止)

  • 晒伤可以继承
  • 我有 3 个参数不同步,更新了代码和错误

现在它总是缺少一个参数。也许是“自己”?我真的不知道该再看哪里了,错误与以前相同(相同的堆栈跟踪),只是不同的错误参数。

发现问题实际上,向初始化参数添加一些默认值帮助我发现了真正的错误:输入中缺少字段。抱歉耽误了大家的时间,再次感谢您的咨询

最佳答案

我已经采用了您的代码(从 __init__ 中删除了 do* 方法)并变成了一个更简单的示例,以尝试在您陈述时重新创建您的问题.

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 = dom
self.url = web
self.description = desc
self.location = loc
self.date = date

class JobAd(BaseAd):
""" extends BaseAd with more parameters """

def __init__(self, domain, url, location, countrycode, area, city,
index_date, description, solr_highlights,
contract_type, salary, company, job_title, **kwargs):

self.contract_type = contract_type
self.salary = salary
self.company = company
self.title = job_title

""" Super constructor call """
super(JobAd, self).__init__(
domain,
url,
location,
countrycode,
area,
city,
index_date,
description,
solr_highlights,
**kwargs
)

j = JobAd(1,2,3,4,5,6,7,8,9,10,11,12,13,kwarg1="foo",kwarg2="bar")

运行 python 2.7.2 时,执行正常,没有错误。我建议错误中引用的 __init__ 可能是 JobAd 而不是 super,因为 JobAd 的 init 实际上有 14 个参数,其中是错误所提示的。我建议尝试找到一个调用 JobAdd 的 __init__ 且参数数量不足的地方。

正如其他人所说,发布完整的堆栈跟踪并显示 JobAd 的使用方式对于确定根本原因非常宝贵。

关于Python继承: init is having an issue with the number of params,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10952104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com