通过类变量公开数据的推荐“设计模式”是什么?

时间:2011-02-02 06:20:48

标签: python oop design-patterns

我见过很多模块允许人们使用以下方式访问数据:

print blah.name

相反:

print blah.get_name()

鉴于name是一个静态变量,使用变量方法而不是调用函数似乎是更好的选择。

我想知道自己实施这项计划的最佳设计是什么。例如,给定一个Person对象,我应该如何公开nameage

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

是否有推荐替代方案?

3 个答案:

答案 0 :(得分:5)

Python properties旨在解决此问题。

属性允许阶段blah.nameblah.name = xdel 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。它为你做了很多工作。它已将列映射为对象属性。