我遇到了这样一种情况,即子类化 unicode 会导致 Python 3.3 之前的弃用警告和 Python 3.3 上的错误:
# prove that unicode.__init__ accepts parameters
s = unicode('foo')
s.__init__('foo')
unicode.__init__(s, 'foo')
class unicode2(unicode):
def __init__(self, other):
super(unicode2, self).__init__(other)
s = unicode2('foo')
class unicode3(unicode):
def __init__(self, other):
unicode.__init__(self, other)
s = unicode3('foo')
奇怪的是,警告/错误不会出现在前三行,而是出现在第 8 行和第 14 行。这是 Python 2.7 的输出。
> python -Wd .\init.py
.\init.py:8: DeprecationWarning: object.__init__() takes no parameters
super(unicode2, self).__init__(other)
.\init.py:14: DeprecationWarning: object.__init__() takes no parameters
unicode.__init__(self, other)
代码被简化以举例说明问题。在现实世界的应用程序中,我会执行的不仅仅是调用 super __init__
。
从 unicode 类实现的前三行可以看出,__init__
该方法至少接受一个参数。但是,如果我想从子类调用该方法,无论我是否调用,我似乎都无法这样做super()
。
为什么可以调用unicode.__init__
unicode 实例但不能调用 unicode 子类?如果子类化 unicode 类,作者该怎么办?