使用@property直接访问变量

时间:2015-07-20 15:02:10

标签: python python-2.7

我有一个带变量x的MyLib类。我不在课外使用这个变量,但是我从包外的另一个类中设置它。我想知道将值设置为下面的变量x的首选方法是什么。 我应该直接设置它,如下面的代码片段所示 我应该创建@property和@ x.setter函数来设置它。

class MyLib:
   def __init__(self, *args, **kwargs)
       self._x = None
   def func_to_process_x():
       # do something

class UseLib:
    self._x = 'ABC'

注意:这个问题与使用getter和setter的属性无关。相反,我想知道如果我们可以直接使用变量,是否建议使用属性/ getter / setter,因为Python中没有任何内容。 此外,除了简单地将值赋给变量之外,即使我在@x.setter函数中没有做任何事情,也建议使用属性。基本上想知道属性的开销是否值得以封装的名义进行(即使它不是纯粹意义上的封装,因为没有什么是私有的。如果我错了,请纠正我)

1 个答案:

答案 0 :(得分:4)

这很简单:只要你不需要它们就可以避免它们。从C ++,C#或Java切换到Python的人可能会遇到以下代码:

class C:
    _x = None

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

第一个问题:为什么?为了看“OOPish”?上面的代码没有实现,通过以下方式无法实现:

class C:
    x = None

这就是Python属性的美妙之处:您可以将变量版本交换为属性,而不会让API API用户知道它。可能有任何原因,例如记录,验证,业务逻辑等:

class C:
    ...
    ...
    @x.setter
    def x(self, value):
        self._x = value
        log('x set to {}'.format(value))

底线:使用变量,在需要拦截正在读取和/或写入的变量时切换到属性。