Python2.7新式类及web2py中FPDF子类super()报错问题咨询
解决Python 2.7中super()调用报错的问题
嘿,我来帮你捋清楚这个Python 2.7里super()报错的问题——毕竟Python2的类模型确实容易踩坑!
首先得明确Python 2.7里两类类的核心区别,这是你问题的根源:
- 新式类:必须显式继承
object(或者继承自其他已经是新式类的父类),这类类的实例类型会显示成<class ...>,就像你测试的t1那样 - 经典类:没有继承
object的老派类,实例类型是<type 'instance'>(比如你测试的t2),这类类完全不支持super()语法
你遇到的TypeError: super() argument 1 must be type, not function报错,本质就是Python 2.7中super()只能用于新式类,结合你的web2py场景,大概率是下面两种情况之一:
第一步:先确认父类FPDF的类型
你以为FPDF是继承object的新式类,但web2py的受限环境(就是你看到的__restricted__命名空间)可能会改变类的识别方式。先在你的web2py环境里跑个验证:
print type(FPDF) # 如果输出是<type 'type'>,说明它是新式类;要是输出<type 'classobj'>,那就是经典类
针对不同情况的解决方案
情况1:FPDF是经典类(输出<type 'classobj'>)
如果FPDF是经典类,那Python2的super()根本用不了,直接换个方式——调用父类的构造函数就行:
class MyFPDF(FPDF, HTMLMixin): # 你的类属性... def __init__(self, data): # 直接调用FPDF的__init__,传入self FPDF.__init__(self) self.res = data['res'] # 经销商信息 self.cust = data['customer'] # 客户信息 # 剩下的初始化代码
情况2:FPDF是新式类(输出<type 'type'>)
如果确认是新式类,那可能是super()的调用细节或者web2py的环境限制问题,可以试试两种修复:
- 调整super()的调用方式:
用type(self)来明确指定类型,替代硬编码的类名:
super(type(self), self).__init__()
- 显式让你的类成为新式类:
虽然你继承了FPDF,但可以在继承列表最后加上object,强制类被识别为新式类:
class MyFPDF(FPDF, HTMLMixin, object): # 你的类属性... def __init__(self, data): super(MyFPDF, self).__init__() self.res = data['res'] self.cust = data['customer'] # 剩下的初始化代码
额外的验证小技巧
你可以在web2py里先测试一个极简的新式类,确认环境本身支持super():
class TestNewStyle(object): def __init__(self): print "父类初始化" class TestChild(TestNewStyle): def __init__(self): super(TestChild, self).__init__() print "子类初始化" tc = TestChild() # 如果能正常打印两行内容,说明环境没问题,问题出在你的FPDF继承逻辑上
内容的提问来源于stack exchange,提问作者Eddie
相关产品推荐
相关产品推荐

