Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 什么';建议的';设计模式';用于通过类变量公开数据?_Python_Oop_Design Patterns - Fatal编程技术网

Python 什么';建议的';设计模式';用于通过类变量公开数据?

Python 什么';建议的';设计模式';用于通过类变量公开数据?,python,oop,design-patterns,Python,Oop,Design Patterns,我已经看到很多模块允许人们使用以下方式访问数据: print blah.name 与之相反: print blah.get_name() 如果名称是静态变量,那么使用variable方法似乎比调用函数更好 我想知道什么是最好的“设计”来实现这一点自己。例如,给定一个人对象,我应该如何公开姓名和年龄 class Person: def __init__(self, id): self.name = self.get_name(id) self.age

我已经看到很多模块允许人们使用以下方式访问数据:

print blah.name
与之相反:

print blah.get_name()

如果名称是静态变量,那么使用variable方法似乎比调用函数更好

我想知道什么是最好的“设计”来实现这一点自己。例如,给定一个
对象,我应该如何公开
姓名
年龄

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
是否有推荐的替代方案?

Python旨在解决此问题


属性允许阶段
blah.name
blah.name=x
del blah.name
自动调用getter、setter和deleter方法(如果已定义此类方法)

我可能误解了你的问题,但我认为你想得太多了。除非您需要在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()

考虑到你的例子,你可能想看看它的ORM。它为你做了很多工作。它已经将列映射为对象属性

我在考虑使用Person.save()函数。如果他们要编辑姓名/年龄并调用save(),数据库将更新以反映更改。使用
属性
,我似乎可以定义当变量更改时将保存哪些变量。我确实使用sqlalchemy将属性映射到列。不过,我喜欢创建包装器对象。我将创建ORM类来创建映射,然后创建一个新类,该类具有get_name()、set_age()等@greg why?你通过它实现了什么?“给定的名称是一个静态变量”“类变量”。两者都是完全错误的。您的示例都只是实例变量。既不是类变量,也不是静态变量。请修正问题和标题,用“实例变量”替换“静态变量”和“类变量”。@greg这是一种标准的、定义良好的、实现良好的方法。