1

我正在为我的 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 参数添加一些默认值帮助我发现了真正的错误:输入中缺少字段。对不起,你们浪费了你们的时间,再次感谢你们的咨询

4

1 回答 1

1

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

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 的,因为JobAdinit 实际上有 14 个参数,这就是错误所抱怨的。我建议尝试找到一个__init__调用 JobAdd 时参数数量不足的地方。

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

于 2012-06-08T16:14:23.887 回答