使用描述符访问变量,而不是将该变量与实例中的目标绑定



我刚刚阅读了momoko文档,并遇到了以下类:

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

每次访问BaseHandlerbase_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函数文档

最新更新