我有一个带变量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
函数中没有做任何事情,也建议使用属性。基本上想知道属性的开销是否值得以封装的名义进行(即使它不是纯粹意义上的封装,因为没有什么是私有的。如果我错了,请纠正我)
答案 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))
底线:使用变量,在需要拦截正在读取和/或写入的变量时切换到属性。