我见过很多模块允许人们使用以下方式访问数据:
print blah.name
相反:
print blah.get_name()
鉴于name是一个静态变量,使用变量方法而不是调用函数似乎是更好的选择。
我想知道自己实施这项计划的最佳设计是什么。例如,给定一个Person
对象,我应该如何公开name
和age
?
class Person:
def __init__(self, id):
self.name = self.get_name(id)
self.age = self.get_age(id)
def get_name(self, id=None):
if not id:
return self.name
else:
# sql query to get the name
这样我就可以:
x = Person
print x.name
是否有推荐替代方案?
答案 0 :(得分:5)
Python properties旨在解决此问题。
属性允许阶段blah.name
,blah.name = x
和del blah.name
自动调用getter,setter和deleter方法(如果已定义此类方法)。
答案 1 :(得分:1)
我可能误解了你的问题,但我认为你是在思考它。除非你需要在getter或setter中做一些特殊的事情,否则不需要声明属性。您只需在需要时开始使用它们,如下所示:
class Person:
pass
x = Person
x.name = "test"
print x.name
如果你确实需要在getter或setter中做一些特殊的事情,比如SQL查询,试试这个:
class Person(object):
def __init__(self):
self._name = None
self._name_changed = False
@property
def name(self):
if not self._name:
self._name = 'select sql query'
return self._name
@name.setter
def name(self, value):
self._name = value
self._name_changed = True
def save(self):
if self._name_changed:
print 'update sql query set name=' + self._name
self._name_changed = False
x = Person()
x.name = 'test'
print x.name
x.save()
答案 2 :(得分:1)
根据您的示例,您可能需要查看sqlalchemy及其ORM。它为你做了很多工作。它已将列映射为对象属性。