You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的环境限制问题,可以试试两种修复:

  1. 调整super()的调用方式:
    用type(self)来明确指定类型,替代硬编码的类名:
super(type(self), self).__init__()
  1. 显式让你的类成为新式类:
    虽然你继承了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:53:31