python 初始化 class 派生自并抽象一个时出错
python error when initializing a class derived from and abstract one
我有这个简单的代码,但出现了一个奇怪的错误:
from abc import ABCMeta, abstractmethod
class CVIterator(ABCMeta):
def __init__(self):
self.n = None # the value of n is obtained in the fit method
return
class KFold_new_version(CVIterator): # new version of KFold
def __init__(self, k):
assert k > 0, ValueError('cannot have k below 1')
self.k = k
return
cv = KFold_new_version(10)
In [4]: ---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-ec56652b1fdc> in <module>()
----> 1 __pyfile = open('''/tmp/py13196IBS''');exec(compile(__pyfile.read(), '''/home/donbeo/Desktop/prova.py''', 'exec'));__pyfile.close()
/home/donbeo/Desktop/prova.py in <module>()
19
20
---> 21 cv = KFold_new_version(10)
TypeError: __new__() missing 2 required positional arguments: 'bases' and 'namespace'
我做错了什么?理论上的解释将不胜感激。
您错误地使用了 ABCMeta
元 class。它是 元 class,而不是基础 class。照原样使用它。
对于 Python 2,这意味着将其分配给 class 上的 __metaclass__
属性:
class CVIterator(object):
__metaclass__ = ABCMeta
def __init__(self):
self.n = None # the value of n is obtained in the fit method
在 Python 3 中,您将在定义 class:
时使用 metaclass=...
语法
class CVIterator(metaclass=ABCMeta):
def __init__(self):
self.n = None # the value of n is obtained in the fit method
从 Python 3.4 开始,您可以使用 abc.ABC
helper class 作为基础 class:
from abc import ABC
class CVIterator(ABC):
def __init__(self):
self.n = None # the value of n is obtained in the fit method
我有这个简单的代码,但出现了一个奇怪的错误:
from abc import ABCMeta, abstractmethod
class CVIterator(ABCMeta):
def __init__(self):
self.n = None # the value of n is obtained in the fit method
return
class KFold_new_version(CVIterator): # new version of KFold
def __init__(self, k):
assert k > 0, ValueError('cannot have k below 1')
self.k = k
return
cv = KFold_new_version(10)
In [4]: ---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-ec56652b1fdc> in <module>()
----> 1 __pyfile = open('''/tmp/py13196IBS''');exec(compile(__pyfile.read(), '''/home/donbeo/Desktop/prova.py''', 'exec'));__pyfile.close()
/home/donbeo/Desktop/prova.py in <module>()
19
20
---> 21 cv = KFold_new_version(10)
TypeError: __new__() missing 2 required positional arguments: 'bases' and 'namespace'
我做错了什么?理论上的解释将不胜感激。
您错误地使用了 ABCMeta
元 class。它是 元 class,而不是基础 class。照原样使用它。
对于 Python 2,这意味着将其分配给 class 上的 __metaclass__
属性:
class CVIterator(object):
__metaclass__ = ABCMeta
def __init__(self):
self.n = None # the value of n is obtained in the fit method
在 Python 3 中,您将在定义 class:
时使用metaclass=...
语法
class CVIterator(metaclass=ABCMeta):
def __init__(self):
self.n = None # the value of n is obtained in the fit method
从 Python 3.4 开始,您可以使用 abc.ABC
helper class 作为基础 class:
from abc import ABC
class CVIterator(ABC):
def __init__(self):
self.n = None # the value of n is obtained in the fit method