我刚刚阅读了momoko
文档,并遇到了以下类:
class BaseHandler(RequestHandler):
@property
def db(self):
return self.application.db
每次访问BaseHandler
的base_handler
实例的db
属性时,将调用db(self)
,返回self.application.db
。
这段代码比下面的代码有什么优势?
class BaseHandler(RequestHandler):
def __init__(self):
self.db = self.application.db
将实例变量db
绑定到self.application.db
。
我理解前一种方法将避免我们在每个实例中都有self.db
。另一方面,self.application.db
有额外的属性解析步骤(额外的.
)。
前一种方法有什么我没有看到的优点吗?
设置db
为只读。你不能设置 base_handler.db
,没有与属性相关联的setter:
>>> class Foo(object):
... @property
... def bar(self): return 'spam'
...
>>> foo = Foo()
>>> foo.bar
'spam'
>>> foo.bar = 'ham'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
你需要为它添加一个可写的setter:
class Foo(object):
_bar = 'spam'
@property
def bar(self):
return self._bar
@bar.setter
def bar(self, value):
self._bar = value
注意@name_of_property.setter
装饰器;属性对象本身为您提供了一个decorator函数,用于创建一个new decorator,并将setter替换为新的decorator函数。.deleter
也有等价的。详细信息请参见property
函数文档