我有使用@property
装饰器设置属性的类。它们使用其中的 try 和 except 子句充当 getter 和 setter。如果未设置属性,它将从数据库中获取数据并使用它来实例化来自其他类的对象。我试图使示例简短,但是用于实例化属性对象的代码对于每个属性都略有不同。它们的共同点是一开始的 try-except。
class SubClass(TopClass):
@property
def thing(self):
try:
return self._thing
except AttributeError:
# We don't have any thing yet
pass
thing = get_some_thing_from_db('thing')
if not thing:
raise AttributeError()
self._thing = TheThing(thing)
return self._thing
@property
def another_thing(self):
try:
return self._another_thing
except AttributeError:
# We don't have things like this yet
pass
another_thing = get_some_thing_from_db('another')
if not another_thing:
raise AttributeError()
self._another_thing = AnotherThing(another_thing)
return self._another_thing
...etc...
@property
def one_more_thing(self):
try:
return self._one_more_thing
except AttributeError:
# We don't have this thing yet
pass
one_thing = get_some_thing_from_db('one')
if not one_thing:
raise AttributeError()
self._one_more_thing = OneThing(one_thing)
return self._one_more_thing
我的问题:这是一种正确的(例如pythonic)做事方式吗?对我来说,在所有内容之上添加 try-except-segment 似乎有点尴尬。另一方面,它使代码保持简短。或者有没有更好的方法来定义属性?