首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python __setattr__属性问题

python __setattr__属性问题
EN

Stack Overflow用户
提问于 2015-03-10 13:29:40
回答 1查看 286关注 0票数 0

我有一个用于处理postgresql的类:

代码语言:javascript
复制
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__超载:

代码语言:javascript
复制
def __setattr__(self, name, value):
    super(DBclass, self).__setattr__(name, value)
    self.load()

以及用于从db连接到加载内容的方法:

代码语言:javascript
复制
def load(self):
    # Here I send select query and get two remaining values

使用此__setattr__,我只能初始化__id__table值。我的数据库中还有两个字段没有加载。我无法使用__setattr__初始化它们,因为__table变量还没有初始化,__id和python也不能调用load方法和发送查询。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-10 13:38:10

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

只需将load()移动到__init__()中,就可以完全摆脱__setattr__()

代码语言:javascript
复制
 def __init__(self, id=None):
    self.__id       = id
    self.__table    = self.__class__.__name__.lower()
    self.load()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28965065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档