【问题标题】:Initialising Python properties初始化 Python 属性
【发布时间】:2016-05-02 23:28:23
【问题描述】:

我正在编写一个 Python 类来使用 pyscopg2 管理 Postgres 数据库连接。

我希望该类在初始化时建立与数据库的连接(我觉得这可能是一个糟糕的主意,但我想不出一个好的理由)。我正在尝试使用我以前从未使用过的属性来完成这项工作。换句话说,我希望从 __init__ 方法中调用 getter。

我的班级看起来像这样:

class MyDatabase:
    connection_string = "host='<host_ip>' db_name='<db_name>'"

    def __init__(self):
        # *
        self._connection = connection

    @property
    def connection(self):
        # Check for an existing connection
        if self._connection:
            self._connection.close()
        self._connection = psycopg2.connect(connection_string)
        return self._connection

    ...

在这个版本中,检查现有连接会抛出AttributeError: Elefriends instance has no attribute '_connection',这是有道理的。我可以通过在我用# * 标记的地方简单地添加一条写着self._connection = None 的行来解决这个问题,但这感觉很笨拙。这是我为了方便而付出的代价吗?我只是在挑剔吗?还是有更好的办法?

谢谢!

【问题讨论】:

  • 您真的想要一个全新的连接每次您都要求连接吗?只需将其设置为您的 __init__ 中的常规属性即可。
  • if hasattr(self,"_connection") 但我会说那会更糟。
  • 但我真的同意 Kindall,你真的确定每次访问该属性时它都应该建立新的连接吗?
  • 这个想法是连接获取器将仅用于初始化连接,或者如果它出现问题。我什至可以将其设为“private”。通常我会计划只使用fetch(query_string) 的方法,而不用担心连接。这是一个糟糕的设计模式吗?我想我可以有一个单独的方法来初始化连接,另一种方法来关闭它并返回一个新的,但这更麻烦

标签: python postgresql python-2.7 properties psycopg2


【解决方案1】:

您可以使用以下语句代替 if ... 语句:

try:
    self._connection.close()
except AttributeError:
    pass
self._connection = psycopg2.connect(connection_string)
return self._connection

【讨论】:

    猜你喜欢
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 2011-12-03
    • 2021-09-27
    • 1970-01-01
    相关资源
    最近更新 更多