将参数传递给装饰器 Class in Python
Pass parameters to a decorator Class in Python
我正在尝试为 Db 模型编写装饰器,以使该模型可序列化
def Schema(cls):
class Schema(marshmallow.ModelSchema):
class Meta:
model = cls
cls.Schema = Schema
return cls
@Schema
class SerialInterface(sql.Model, InheritanceModel):
id = sql.Column(types.Integer, primary_key=True)
transmission_rate = sql.Column(types.Integer)
type = sql.Column(sql.String(50))
mad_id = sql.Column(types.Integer, sql.ForeignKey('mad.id'))
serial_protocol = sql.relationship(SerialProtocol, uselist=False, cascade="all, delete-orphan")
但是我想在这个装饰器中传递嵌套对象,像这样:
@Schema(nested=['serial_protocol'])
class SerialInterface(sql.Model, InheritanceModel):
你可以这样做:
def Schema(*args, **kwargs):
def wrapped(cls):
class Schema(marshmallow.ModelSchema):
class Meta:
model = cls
cls.Schema = Schema
return cls
return wrapped
然后 @Schema(nested=['serial_protocol'])
就可以了。
这是如何工作的,您创建一个接受参数的函数和 returns 一个装饰器。从那里装饰器像普通的 Python 装饰器一样工作。
@Schema(nested=['serial_protocol'])
class SerialInterface:
...
装饰器翻译为:
SerialInterface = Schema(nested=['serial_protocol'])(SerialInterface)
额外提示,使用 functools.wraps
模块 :) 请参阅 why
我正在尝试为 Db 模型编写装饰器,以使该模型可序列化
def Schema(cls):
class Schema(marshmallow.ModelSchema):
class Meta:
model = cls
cls.Schema = Schema
return cls
@Schema
class SerialInterface(sql.Model, InheritanceModel):
id = sql.Column(types.Integer, primary_key=True)
transmission_rate = sql.Column(types.Integer)
type = sql.Column(sql.String(50))
mad_id = sql.Column(types.Integer, sql.ForeignKey('mad.id'))
serial_protocol = sql.relationship(SerialProtocol, uselist=False, cascade="all, delete-orphan")
但是我想在这个装饰器中传递嵌套对象,像这样:
@Schema(nested=['serial_protocol'])
class SerialInterface(sql.Model, InheritanceModel):
你可以这样做:
def Schema(*args, **kwargs):
def wrapped(cls):
class Schema(marshmallow.ModelSchema):
class Meta:
model = cls
cls.Schema = Schema
return cls
return wrapped
然后 @Schema(nested=['serial_protocol'])
就可以了。
这是如何工作的,您创建一个接受参数的函数和 returns 一个装饰器。从那里装饰器像普通的 Python 装饰器一样工作。
@Schema(nested=['serial_protocol'])
class SerialInterface:
...
装饰器翻译为:
SerialInterface = Schema(nested=['serial_protocol'])(SerialInterface)
额外提示,使用 functools.wraps
模块 :) 请参阅 why