考虑以下类:
class MyObject(object):
__slots__ = ('_att1', '_att2')
def __init__(self):
self._att1 = None
self._att2 = None
@property
def att1(self):
"""READ-ONLY property. """
return self._att1
@property
def att2(self):
"""att2 property description. """
return self._att2
@att2.setter
def att2(self, val):
self._att2 = val
使用属性装饰器的一个好处是我们可以添加一些文档
a = MyObject()
help(a)
Help on MyObject in module __main__ object:
class MyObject(__builtin__.object)
| Methods defined here:
|
| __init__(self)
|
| ----------------------------------------------------------------------
| Data descriptors defined here:
|
| att1
| READ-ONLY property.
|
| att2
| att2 property description.
如果该类旨在供最终用户使用,则可以使用属性访问属性。
a.att2 = "new value"
但是,如果我要从中派生一个类MyObject
,是否可以在派生类中使用“受保护”变量?那是,
class Derived(MyObject):
__slots__ = ()
def __init__(self):
self._att1 = 1
self._att2 = 0
@property
def att2(self):
"""att2 adds 1 to itself in every call. """
self._att2 += 1
return self._att2
@att2.setter
def att2(self, val):
self._att2 = val
我知道如果MyObject
是来自第三方的对象,那么带有下划线的属性可能会发生变化,因此如果它们发生变化,我的代码就会中断。但是,由于我将MyObject
其用作基类,因此我认为可以将其与我自己的派生类一起使用。
我最近开始使用pylint
它,它让我意识到我在派生类中使用了“受保护”变量。我决定在这里发布问题的原因是想知道这是否可以接受,这样我就可以在pylint
. 如果不是,那么处理这个问题的标准是什么?
我想说的另一点是关于属性访问。什么会更快
a.att1
或者
a._att1
我的印象是,通过执行a.att1
python 会首先查看对象字典或插槽,如我正在使用的示例中。如果它在查找函数时不存在(如 的情况__getattr__
)。在我的类定义中进行大量计算时,我宁愿访问位于字典或插槽中的东西,而不是我用装饰器定义的东西。这在 python 社区中被认为是不好的做法吗?我只是问这个,因为默认配置pylint
告诉我否则我想继续工作,牢记良好的标准。
编辑:
让我们尽量不要讨论__slots__
过早的优化。如果可能的话,假设在我的原始帖子中我没有使用__slots__
,并且所有内容都在对象的字典中。