1

我刚刚在阅读momoko文档,并遇到了以下课程:

class BaseHandler(RequestHandler):
    @property
    def db(self):
        return self.application.db

每次我们要访问的实例的db属性时,都会调用 ,并返回。base_handlerBaseHandlerdb(self)self.application.db

此代码与以下代码相比有什么优势?

class BaseHandler(RequestHandler):
    def __init__(self):
        self.db = self.application.db

这会将实例变量绑定dbself.application.db.

我知道前一种方法将避免我们self.db在每种情况下都有。另一方面,self.application.db具有额外的属性解析步骤(extra .)。

前一种方法有什么我看不到的优点吗?

4

1 回答 1

4

它使db只读。您不能设置 base_handler.db,没有与该属性关联的设置器:

>>> 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

您需要添加一个设置器才能使其可写:

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装饰器;属性对象本身为您提供了一个装饰器函数来创建一个的装饰器,并将 setter 替换为新的装饰函数。也有一个.deleter等价物。有关更多详细信息,请参阅property函数文档。

于 2013-06-18T14:41:27.997 回答