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这是一种标准的、定义良好的、实现良好的方法。