相关疑难解决方法(0)

为什么我不能将datetime.date子类化?

以下为什么不工作(Python 2.5.2)?

>>> import datetime
>>> class D(datetime.date):
        def __init__(self, year):
            datetime.date.__init__(self, year, 1, 1)
>>> D(2008)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: function takes exactly 3 arguments (1 given)
Run Code Online (Sandbox Code Playgroud)

我想创建一个类似datetime.date但具有不同__init__功能的类.显然我的功能永远不会被调用.相反,原来datetime.date.__init__被调用并失败,因为这需要3个参数,而我正在传递一个.

这里发生了什么?这是一个线索吗?

>>> datetime.date.__init__
<slot wrapper '__init__' of 'object' objects>
Run Code Online (Sandbox Code Playgroud)

谢谢!

python oop datetime subclass

19
推荐指数
2
解决办法
5888
查看次数

__cinit__() 在扩展 Cython 类时恰好采用 2 个位置参数

我想扩展 scikit-learn 的ClassificationCriterion类,它被定义为内部模块中的 Cython 类sklearn.tree._criterion。我想在 Python 中做到这一点,因为通常我无法访问 sklearn 的 pyx/pxd 文件(所以我不能访问cimport它们)。但是,当我尝试扩展时ClassificationCriterion,出现错误TypeError: __cinit__() takes exactly 2 positional arguments (0 given)。下面的 MWE 重现了错误,并显示错误发生__new____init__.

有没有办法像这样扩展 Cython 类?

from sklearn.tree import DecisionTreeClassifier
from sklearn.tree._criterion import ClassificationCriterion

class MaxChildPrecision(ClassificationCriterion):
    def __new__(self, *args, **kwargs):
        print('new')
        super().__new__(MaxChildPrecision, *args, **kwargs)

    def __init__(self, *args, **kwargs):
        print('init')
        super(MaxChildPrecision).__init__(*args, **kwargs)

clf = DecisionTreeClassifier(criterion=MaxChildPrecision())
Run Code Online (Sandbox Code Playgroud)

python runtime-error subclass cython scikit-learn

3
推荐指数
1
解决办法
3220
查看次数

标签 统计

python ×2

subclass ×2

cython ×1

datetime ×1

oop ×1

runtime-error ×1

scikit-learn ×1