【问题标题】:python __setattr__ attribute issuepython __setattr__ 属性问题
【发布时间】:2023-03-09 11:56:01
【问题描述】:

我有一个专为使用 postgresql db 设计的课程:

dbclass = DBclass(1)
class DBclass(object):
    select_query    = 'SELECT * FROM "{table}" WHERE {table}_id=%s'

    def __init__(self, id=None):
            self.__id       = id
            self.__table    = self.__class__.__name__.lower()

我有 __setattr__ 重载:

def __setattr__(self, name, value):
    super(DBclass, self).__setattr__(name, value)
    self.load()

以及用于连接从数据库加载内容的方法:

def load(self):
    # Here I send select query and get two remaining values

有了这个__setattr__,我只能初始化__id__table 值。我的数据库中仍有两个字段未加载。我无法使用__setattr__ 初始化它们,因为__table 变量尚未初始化以及__id 和python 无法调用加载方法并发送查询。

也许我在我的决定中输入了错误的逻辑,不应该这样启动来自 db 的值。

【问题讨论】:

  • 下一次,包括您在尝试分配值时遇到的错误。我怀疑 load() 会根据条件触发几个不同的错误,并且在包含错误时更容易对响应充满信心。它还有助于表明您在寻求帮助之前已经尝试了几件事。

标签: python setattr


【解决方案1】:

您的load() 方法似乎很可能会分配您的其他两个值,这意味着它将至少调用__setattr__() 两次。除非你在load() 中有逻辑来避免它,否则你几乎肯定会创建一个无限循环。基本加载方法不太可能是您想从 __setattr__() 中调用的东西,因为它可能会产生意想不到的副作用(例如,每当您更新对象上的任何值时,数据库中的所有值都会被重置)。

只需将load() 移动到__init__() 并完全删除__setattr__()

 def __init__(self, id=None):
    self.__id       = id
    self.__table    = self.__class__.__name__.lower()
    self.load()

【讨论】:

  • 是的,很好的建议。但是在 python 中有什么方法可以将负载放入 setattr 以便首先启动 __table 然后调用 load 方法?
  • 当然:使加载调用以 __table 的存在为条件。这可能仍然不是一个好主意。您需要做一些事情来阻止 load() 调用 __setattr__(),这也是可能的,但很难看。你应该确保你有充分的理由来证明你的设计选择是合理的。
猜你喜欢
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 2021-11-28
相关资源
最近更新 更多