使用super()时发生python错误

2024-03-28 17:02:39 发布

您现在位置:Python中文网/ 问答频道 /正文

from flask_sqlalchemy import SQLAlchemy
import datetime

db = SQLAlchemy()

class BaseModel(db.Model):
    """Base data model for all objects"""
    __abstract__ = True

    def __init__(self, *args):
        super(self).__init__(*args)

    def __repr__(self):
        """Define a base way to print models"""
        return '%s(%s)' % (self.__class__.__name__, {
            column: value
            for column, value in self._to_dict().items()
        })

    def json(self):
        """Define a base way to jsonify models, dealing with datetime objects"""
        return {
            column: value if not isinstance(value, datetime.date) else value.strftime('%Y-%m-%d')
            for column, value in self._to_dict().items()
        }


class Station(BaseModel, db.Model):
    """Model for the stations table"""
    __tablename__ = 'stations'

    id = db.Column(db.Integer, primary_key = True)
    lat = db.Column(db.Float)
    lng = db.Column(db.Float)

TypeError: super() argument 1 must be type, not Station

我知道没有参数的super只在python3中使用。但在我的情况下,我应该在super()中填写什么?也可以将super()放在父类(basemodel)的init中吗?你知道吗


Tags: toimportselffordbdatetimemodelsqlalchemy
1条回答
网友
1楼 · 发布于 2024-03-28 17:02:39

因为您在BaseModel.__init__中没有做任何事情,所以正确的方法是根本不实现它。如果没有在BaseModel中定义__init__,您将自动地、更有效地转到超类的__init__。你知道吗

也就是说,如果你BaseModel.__init__中做了一些有意义的事情,你不能像那样使用一个参数super。有一个参数super的用途非常有限(基本上,只适用于classmethod,您传递的是类型,而不是类型的实例作为参数)。您需要two-argument ^{},显式提供您试图绕过寻找超类的当前类的名称,然后self,例如:

class BaseModel(db.Model):
    """Base data model for all objects"""
    __abstract__ = True

    def __init__(self, *args):
        super(BaseModel, self).__init__(*args)

相关问题 更多 >