gpt4 book ai didi

python - 列的属性行为(getter 和 setter),而不是正常的属性行为

转载 作者:行者123 更新时间:2023-11-30 22:51:37 25 4
gpt4 key购买 nike

SQLAlchemy 是否支持这样的东西:

class Character(Base):
__tablename__ = 'character'
id = Column(Integer, primary_key=True)
level = Column(Integer)

@ColumnProperty(Integer)
def xp(self):
return self._xp

@xp.setter
def xp(self, value):
self._xp = value
while self._xp >= self.xp_to_level_up():
self.level += 1
self._xp -= 100

def __init__(self, level=0, xp=0):
self.level = level
self._xp = xp

idlevelxp 将存储到数据库中。所以基本上是一个Column,但不是属性而是属性。

最佳答案

只需添加一个 _xp 列定义,映射到表中的 xp 列,并使用常规 @property 对象来实现你的设置逻辑:

class Character(Base):
__tablename__ = 'character'
id = Column(Integer, primary_key=True)
level = Column(Integer)
_xp = Column('xp', Integer)

def __init__(self, level=0, xp=0):
self.level = level
self._xp = xp

@property
def xp(self):
return self._xp

@xp.setter
def xp(self, value):
self._xp = value
while self._xp >= self.xp_to_level_up():
self.level += 1
self._xp -= 100

参见Naming Columns Distinctly from Attribute Names .

上面将实例上的 _xp 属性存储为 character 表中的 xp,但您的代码使用 Character. xp 属性间接读取和写入 _xp 的值。

您还可以使用@hybrid_property ;这就像上面使用的 property 一样,但也允许您在查询过滤器中使用 Character.xp:

from sqlalchemy.ext.hybrid import hybrid_property

class Character(Base):
__tablename__ = 'character'
id = Column(Integer, primary_key=True)
level = Column(Integer)
_xp = Column('xp', Integer)

def __init__(self, level=0, xp=0):
self.level = level
self._xp = xp

@hybrid_property
def xp(self):
return self._xp

@xp.setter
def xp(self, value):
self._xp = value
while self._xp >= self.xp_to_level_up():
self.level += 1
self._xp -= 100

现在您可以使用 session.query(Character).filter(Character.xp > 42) 和其他此类过滤查询,而不必使用 Character._xp

如果您想对角色进行批量更新,您可能必须 include a update_expression implementation这将告诉 SQLAlchemy 如何为 UPDATE 生成 SET 表达式;除了调整 XP 之外,也许还可以使用 CASE 表达式来处理更新级别。

关于python - 列的属性行为(getter 和 setter),而不是正常的属性行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38955334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com