Python:在setter中使用getter或“private”属性?

2024-10-01 15:44:51 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个类NamedObject,它有一个属性name。现在如果我必须使用setter,我首先必须定义getter(我猜是吗?)是这样的:

class NamedObject:
    def __init__(self, name):
        self.name = name

    @property
    def name(self):
        return self._name

现在我在想,在setter中,我应该使用self._name还是{},getter还是实际属性?在设置名称时,I of c。需要使用_name,但是当我进入setter时呢?例如:

^{pr2}$

用哪一种真的很重要吗?为什么要用一种呢?在


Tags: ofnameself名称return属性定义init
3条回答

使用getter而不是仅仅访问内部变量会向设置逻辑添加另一个函数调用,而在Python中,函数调用非常昂贵。如果你写这篇文章:

def _get_x(self):
    return self._x

def _set_x(self, value):
    self._x = value
x = property(fget=_get_x, fset=_set_x)

那么你就患上了“太多爪哇”综合症。Java开发人员必须编写这种东西,因为如果以后有必要向x的设置或获取添加行为,则必须重新编译类之外对x的所有访问。但是在Python中,最好保持简单,只将x定义为实例变量,并且只有在需要添加某种设置或获取行为时才转换为属性。请参见YAGNIYAGNI。在

如果getter有重要的逻辑(比如lazy初始化),那么应该一直通过getter进行访问。在

class Something(object):
    UNINITIALIZED = object()
    LAZY_ATTRS = ('x','y','z')
    def __init__(self):
        for attr in self.LAZY_ATTRS:
            setattr(self, '_'+attr, self.UNINITIALIZED)
    def _get_x(self):
        if self._x is self.UNINITIALIZED:
            self._x = self.doExpensiveInitStuff('x')
        return self._x

但是如果getter只做return self._x,那么直接访问内部变量。在

当setter是内部接口的一部分时,没有正常的理由使用外部接口。我想您可以构建一个场景,您可能希望,但在默认情况下,只使用内部变量。在

相关问题 更多 >

    热门问题