【发布时间】: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