0

我有一个设计用于使用 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 的值。

4

1 回答 1

1

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

只需移入load()并完全__init__()摆脱。__setattr__()

 def __init__(self, id=None):
    self.__id       = id
    self.__table    = self.__class__.__name__.lower()
    self.load()
于 2015-03-10T13:38:10.613 回答